-4

いくつかの設計パターンを使用して小さなプログラムを作成しており、シングルトンを実装しようとしています。このシングルトン クラスには、自分で定義した 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();

これはセグメンテーション違反を返しません

4

2 に答える 2

5

あなたのロジックは逆です –if (_fileManager)あるべきですif (!_fileManager)

于 2012-04-24T22:00:21.607 に答える
0

シングルトンなしで作成したクラス内で最初にベクトルを使用することをお勧めします。によってオブジェクトを作成しますnew MyClass。それでもセグメンテーション違反が発生する場合は、シングルトンとは何の関係もありません (これは事実だと思います)。

于 2012-04-24T21:40:39.450 に答える