我正在创建一个包含一些设计模式的小程序,我正在尝试实现单例。在这个单例类中,我有一个包含我自己定义的File对象的向量。
现在,在进行实际的push_back时,我遇到了分段错误。我尝试删除单例模式,push_back工作得很好。我在一个论坛上看到问题可能是由于矢量尚未初始化而引起的。他们的方式是否允许我使用我的矢量和我的单例模式而不会导致分段错误?
编辑:
头:
class FileManager
{
public:
static FileManager* GetManager();
~FileManager();
void InitManager();
void LoadAllTitle();
private:
FileManager();
static FileManager* _fileManager;
std::vector<File> _files;
};
源:
//C++ Header
#include <iostream>
//C Header
//local header
#include "filemanager.h"
#include "settings.h"
#include "defs.h"
#include "file.h"
#include "utilities.h"
FileManager* FileManager::_fileManager = NULL;
FileManager* FileManager::GetManager()
{
if( _fileManager )
{
_fileManager = new FileManager();
}
return( _fileManager );
}
FileManager::FileManager()
{
}
FileManager::~FileManager()
{
}
void FileManager::InitManager()
{
int numberOfFile = Settings::GetSettings()->NumberOfFile() + 1;
for( unsigned int i = 1; i < numberOfFile; i++ )
{
std::string path = "data/data";
path += IntToStr( i );
path += ".ndb";
File tempFile( path );
_files.push_back( tempFile ); // segmentation fault
}
printf( " Done...\n" );
}
void FileManager::LoadAllTitle()
{
int numberOfFile = Settings::GetSettings()->NumberOfFile() + 1;
std::string titles = "ALL TITLES: \n";
for( unsigned int i = 1; i < numberOfFile; i++ )
{
titles += _files[i].ReadTitle();
titles += "\n";
}
}
这是我在main.cpp中的调用
FileManager::GetManager()->InitManager();
问题是如果我将我的构造函数公开并在main中执行此操作:
FileManager fm;
fm.InitManager();
这不会返回分段错误
答案 0 :(得分:5)
您的逻辑是倒退的 - if (_fileManager)
应为if (!_fileManager)
。
答案 1 :(得分:0)
我建议你首先在没有单例的情况下使用你创建的类中的向量。通过new MyClass
创建一个目标。如果你仍然得到分段错误,那么它与单例无关(我认为是这种情况)