Сбой объекта статической строки С++ в режиме выпуска

Я прилагаю минимальный код ниже. Проблема связана со статическим строковым объектом, из-за которого происходит утечка памяти. Я думаю, проблема в том, что строковый объект не инициализирован должным образом. Программа нормально работает в режиме отладки, но вылетает в режиме выпуска.

Я использую Windows 7: 64-битная версия MS Visual Studio 2012.

Я попытался инициализировать объект пустой строкой, но это не решило проблему, как предлагается здесь что делать, если отладка работает нормально, но релиз вылетает

Я включил «Обработка предупреждений как ошибок» также не помог, так как нет предупреждений, как предлагается в следующем сообщении что делать, если отладка работает нормально, но релиз падает

Были и другие предложения, такие как «фиаско статического порядка инициализации», но я не думаю, что это связано с моей проблемой.

Любая помощь приветствуется

main.cpp

//main.cpp
#include "MyParameters.h"

using namespace std ;

int main( int argc, char *argv[] )
{
  try
  { 
        cout << "MyParameters::m_outputDir: " << MyParameters::m_outputDir << endl ;

        bool initialized = MyParameters::initialize( "myimo.xml" ) ;                

        cout << "MyParameters::m_outputDir: " << MyParameters::m_outputDir << endl ;
        cout << "Terminating the application..." << endl ;

  }
  catch ( std::exception &e )
  {
    cout << e.what() << std::endl;
  }
}

Мои параметры.h

//MyParameters.h
#ifndef __MY_PARAMETERS_H
#define __MY_PARAMETERS_H

#include <string>
#include <iostream>

 #include <QString>

class MyParameters 
{

public:

  static std::string m_outputDir; ///< output directory

  static bool initialize( const QString &xmlFile  );

private:

  MyParameters();
};

#endif /* __MY_PARAMETERS_H */

Мои параметры.cpp

//MyParameters.cpp
#include "MyParameters.h"
#include <QDir>

std::string MyParameters::m_outputDir ;    

using namespace std ;

MyParameters::MyParameters()
{

}

bool MyParameters::initialize( const QString &xmlFile )
{
  m_outputDir = QDir::current().absoluteFilePath( xmlFile ).toStdString(); // --> this crashes 
    //m_outputDir = "C:\\Dev\\" ; // --> works fine
    cout << "m_outputDir: " << m_outputDir << endl ;

    cout << "myparameters.xml file reading is complete" << endl ;
  return true;
}

person Schnell    schedule 23.10.2014    source источник
comment
MVCE, пожалуйста.   -  person Borgleader    schedule 23.10.2014
comment
Что выводит ваша программа до того, как она выйдет из строя...?   -  person jpo38    schedule 23.10.2014
comment
@ jpo38: Он печатает на консоли Завершение приложения... последнюю строку основного файла, а затем вылетает.   -  person Schnell    schedule 23.10.2014
comment
То же самое, если вы добавите return 0 в конце вашей основной функции? Правильно ли был скомпилирован Qt? Попробуйте простую программу Qt, создающую только статический std::string.   -  person jpo38    schedule 23.10.2014
comment
Есть многое, что вы могли бы и должны обрезать, чтобы сузить проблему. Например, что, если вы измените ParameterFileParser::checkDirectory так, чтобы он просто возвращал копию входной строки? Что, если setDirectory просто устанавливает value в фиксированную строку и возвращает true? Воспользуйтесь советом @Borgleader и создайте MVCE. Вы можете решить свою проблему в пути.   -  person Edward    schedule 23.10.2014
comment
TMTR, но вы, вероятно, столкнулись с фиаско статического порядка инициализации. Почти всегда полезно ознакомиться с FAQ, прежде чем спрашивать.   -  person Cheers and hth. - Alf    schedule 23.10.2014
comment
спасибо, ребята, за предложения. Я попробую их сейчас.   -  person Schnell    schedule 23.10.2014
comment
я сократил пример до минимума. Программа вылетает на QDir::current().absoluteFilePath( xmlFile ).toStdString();, но если я использую фиксированную строку, то она работает нормально. Сбой происходит только в режиме релиза, в режиме отладки работает нормально.   -  person Schnell    schedule 23.10.2014
comment
Хорошо, а теперь разделите эту строку на 3 разные строки и посмотрите, какая из них не работает.   -  person Surt    schedule 23.10.2014
comment
Я разбил его на 3 отдельные строки, но программа вылетает при выходе из основной. На QDir::current().absoluteFilePath( xmlFile ).toStdString(); не падает. Когда я использую фиксированную строку вместо QString.toStdString(), программа отлично работает в режиме выпуска. Также он отлично работает в режиме отладки, но падает только в режиме выпуска. Я не могу понять, почему он падает при выходе из main. Большое спасибо за все предложения от вас, ребята.   -  person Schnell    schedule 24.10.2014
comment
хорошо, я думаю, что нашел проблему. Программа не падала в ReleaseWithDebugInfo. Но я попробовал еще раз в ReleaseWithDebugInfo, скомпилировал программу и включил флаг Свойства->Linker->Debugging->Generate Debug Info (Yes/DEBUG). Затем, когда я выполнил программу, она разбилась, и я нажал кнопку DEBUG. CallStack показал мне динамический деструктор atexit для MyParameters::m_outputDir. Теперь, как решить эту проблему, это другой вопрос, который я попытаюсь выяснить, но я понятия не имею, что такое динамический atexit. Большое спасибо за помощь.   -  person Schnell    schedule 24.10.2014