返回指针时出现运行时错误

时间:2015-01-09 16:47:18

标签: c++ string memory struct destructor

这是一个从文件读取二进制数据然后返回指向对象的指针的方法。

Database* Database::open(const char *path)
{
    ifstream ifs;
    ifs.open(path, ios::in | ios::binary);
    if(!ifs)
    {
        cerr << "Failed to open database." << endl;
        return NULL;
    }
    config_vars cfg;
    ifs.read((char*)&cfg, sizeof(config_vars));
    if ( (ifs.rdstate() & std::ifstream::failbit ) != 0 )
    {
        cerr << "Failed to read database file." << endl;
        return NULL;
    }
    ifs.close();

    Database *db = new Database();
    db->config = cfg;
    db->db_path = string(path);
    return db;
};

调用堆栈显示它是通过销毁config_vars struct的字符串成员来表示的,其定义如下:

struct config_vars
{
    string name;
    string author;
    int date;
};

我无法真正理解导致访问冲突的原因。如果重要的话,这个方法也是静态的。

调用堆栈:

msvcp100d.dll!std::_Container_base12::_Orphan_all()  Line 201 + 0x12 bytes  C++
    NoDB.exe!std::_String_val<char,std::allocator<char> >::~_String_val<char,std::allocator<char> >()  Line 478 + 0xb bytes C++
    NoDB.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >()  Line 754 + 0xf bytes C++
    NoDB.exe!config_vars::~config_vars()  + 0x54 bytes  C++
>   NoDB.exe!Database::open(const char * path)  Line 24 + 0x1b bytes    C++

2 个答案:

答案 0 :(得分:4)

std :: string类只不过是带指针的数据成员。因此无论您使用ifs.read((char*)&cfg, sizeof(config_vars));读取cfg,都会将指针设置为完全无效的指针。这是您违反访问权限的来源。

您需要做的是分别阅读cfg的每个成员。根据cfg文件的格式,您可以执行以下操作:

ifs >> cfg.name;
ifs >> cfg.author;
ifs >> date;

但它可能不会那么容易。

无论如何,这就是你获得访问权限的原因。你需要找到一种不同的方式,但这将是一个不同的问题!祝你好运!

答案 1 :(得分:0)

C ++对象不是字符串。它们不仅仅是平坦的字节集合。一般来说,你不能以这种方式对它们进行反序列化。您将需要一个正确的序列化库。