Я прилагаю минимальный код ниже. Проблема связана со статическим строковым объектом, из-за которого происходит утечка памяти. Я думаю, проблема в том, что строковый объект не инициализирован должным образом. Программа нормально работает в режиме отладки, но вылетает в режиме выпуска.
Я использую 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;
}
ParameterFileParser::checkDirectory
так, чтобы он просто возвращал копию входной строки? Что, еслиsetDirectory
просто устанавливаетvalue
в фиксированную строку и возвращаетtrue
? Воспользуйтесь советом @Borgleader и создайте MVCE. Вы можете решить свою проблему в пути. - person Edward   schedule 23.10.2014QDir::current().absoluteFilePath( xmlFile ).toStdString();
, но если я использую фиксированную строку, то она работает нормально. Сбой происходит только в режиме релиза, в режиме отладки работает нормально. - person Schnell   schedule 23.10.2014QDir::current().absoluteFilePath( xmlFile ).toStdString();
не падает. Когда я использую фиксированную строку вместоQString.toStdString()
, программа отлично работает в режиме выпуска. Также он отлично работает в режиме отладки, но падает только в режиме выпуска. Я не могу понять, почему он падает при выходе из main. Большое спасибо за все предложения от вас, ребята. - person Schnell   schedule 24.10.2014MyParameters::m_outputDir
. Теперь, как решить эту проблему, это другой вопрос, который я попытаюсь выяснить, но я понятия не имею, что такое динамический atexit. Большое спасибо за помощь. - person Schnell   schedule 24.10.2014