push_back 上的分段错误[关闭]

Posted

技术标签:

【中文标题】push_back 上的分段错误[关闭]【英文标题】:Segmentation fault on push_back [closed] 【发布时间】:2012-04-24 21:34:09 【问题描述】:

我正在创建一个带有一些设计模式的小程序,并且我正在尝试实现一个单例。在这个单例类中,我有一个包含我自己定义的 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();

这不会返回分段错误

【问题讨论】:

您的代码可能有问题。所以,发布代码。 为了澄清,你应该先构造一个minimal test-case,然后发布。 为什么需要单例?它与其说是一种模式,不如说是一种反模式。如果代码没有它就可以工作,那么问题就解决了。 很难说为什么没有代码会出现段错误。正如 Mahesh 所说,请发布它,特别是如果它是一个小例子。 【参考方案1】:

你的逻辑是倒退的——if (_fileManager) 应该是if (!_fileManager)

【讨论】:

天哪,谢谢你...我现在觉得有点傻XD【参考方案2】:

我建议你首先在你创建的类中使用向量,而不使用单例。通过new MyClass 创建一个对象。如果仍然遇到分段错误,那么它与单例无关(我相信是这种情况)

【讨论】:

以上是关于push_back 上的分段错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

执行 push_back 后,集合的 C++ 向量给出分段错误

在某些循环内使用 vector.push_back 时出现分段错误

Linux上的AVX分段错误[关闭]

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

分段错误错误 C++

OpenCV中的分段错误