いくつかの設計パターンを使用して小さなプログラムを作成しており、シングルトンを実装しようとしています。このシングルトン クラスには、自分で定義した 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();
問題は、コンストラクターをパブリックに配置し、メインでこれを行う場合です。
FileManager fm;
fm.InitManager();
これはセグメンテーション違反を返しません