为啥这个 cpp 程序会失败?

Posted

技术标签:

【中文标题】为啥这个 cpp 程序会失败?【英文标题】:Why does this cpp program fail?为什么这个 cpp 程序会失败? 【发布时间】:2015-09-29 22:33:18 【问题描述】:

注意:我在调试的时候发现,直到最后一行,程序运行正常,但是走到最后一个括号时,会弹出错误窗口。我对 C++ 不太熟悉,所以找不到问题所在。请帮忙!

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
class test 
    public:
        int x;
        void add_list(int);
        void display();
    private:
        vector<int> list;
;
void test::add_list(int op)

    list.push_back(op);

void test::display()

    cout << x << endl;
    for (unsigned int i=0;i<list.size(); i++)
    cout << "->" << list[i];
    cout << endl;

int main (void)

    test test1;
    test1.x = 3;
    test1.add_list(2);
    test1.add_list(4);
    int size = sizeof (test1);
    ofstream fout ("data.dat", ios_base::binary);
    fout.write((char *)&test1, size);
    fout.close();
    ifstream fin ("data.dat", ios_base::binary);
    test test2;
    fin.read((char *)&test2, size);
    test2.display();
    fin.close();
    return 0;

【问题讨论】:

错误说明了什么? 我们需要知道错误有什么帮助。 @HaroldHuang 像这样读写非 POD 类型将无法正常工作。您无法使用二进制模式保存或读取这些类型。该对象必须正确序列化。 0xC0000005:写入 0xFEEEFEEE 时,发生冲突。 @HaroldHuang 错误的原因很可能是您在read 调用中通过向对象写入垃圾来踩到它。阅读我之前的评论。 【参考方案1】:

这些行

fout.write((char *)&test1, size);

fin.read((char *)&test2, size);

不会工作,因为test 类包含包含指针的对象。 std::list 将使用new 分配额外的内存来存储推送到它的项目。然后它将保留指向这些项目的指针。当您将对象写入磁盘时,它仍将包含那些指向内存的指针。当您再次加载对象时,指针将包含相同的值,但您的程序可能没有分配相同的内存,并且肯定不会为对象分配它。

在您的情况下,test2 似乎可以工作,因为它的内部指针最终与test1 相同,但是当您程序完成时,test1 析构函数释放它分配的内存,然后 test2 析构函数试图释放相同的内存,导致你的错误。

要修复它,您应该更改代码以不使用指针的已定义格式编写对象(例如,写出项目计数,然后是每个项目的整数值)。然后以同样的方式阅读它们。一个简单的 fwrite 将无法做到这一点。

【讨论】:

我认为test1 是可以的,即使在write 之后。是的,write 语句不起作用,但唯一的危害是文件将包含垃圾。问题在于read 的第二行。这就是问题所在,因为构造的对象正在损坏。 @PaulMcKenzie 是的,当然。这就是我想说的,只是所有这些话都妨碍了我:)

以上是关于为啥这个 cpp 程序会失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥程序结束后失败

为啥 GHUnit 的异步测试中的错误断言会使应用程序崩溃,而不仅仅是测试失败?

maya安装失败,为啥,怎么办?

为啥电脑会运行0xc00000ba程序失败

为啥这个 PDO 语句会默默地失败?

为啥这个 Django 模型上的这个非常基本的查询会失败?