c++ - 双重免费或损坏(如果重新订购行则运行正常)

标签 c++

<分区>

link 中使用示例,但改为使用 char *vector:

#include <vector>
using namespace std;

class Test{
    char *myArray;

public:
    Test(){
        myArray = new char[10];
    }

    ~Test(){
        delete[] myArray;
    }   
};  


int main(){
    vector<Test> q; // line 1
    Test t;         // line 2
    q.push_back(t);
}

这会导致双重释放或损坏错误。但是,如果在第 1 行之前运行第 2 行,例如:

Test t;
vector<Test> q;

然后它运行正常。这是为什么?

在 Xubuntu 12.04 g++ 4.6.3 上测试。

更新:

这不是重复的问题。我知道需要一个复制构造函数和一个赋值运算符(它已经在上面的示例代码所在的链接中得到了回答)。但是,像原链接中那样使用int *queue,但交换第1行和第2行,仍然有错误。仅使用char *,和vector 交换第1 行和第2 行不会导致错误。我的问题是为什么是这种特殊情况?任何人都可以在你们的平台上查看吗?

最佳答案

您的类型管理资源(动态分配的数组)但未实现 rule of three .当您这样做时:

q.push_back(t);

q 复制它拥有的 t。所以现在你有一个对象的两个拷贝引用相同的数据,并试图在其中调用 delete

您需要实现复制构造函数和赋值运算符。或者使用管理自己资源的类,例如 std::stringstd::vector

在已删除的数组上调用 delete[]未定义的行为 (UB)。这意味着有时您的程序可能似乎 可以工作。您不能依赖具有未定义行为的程序来做任何事情。交换第 1 行和第 2 行会反转 tq 被销毁的顺序。这似乎会在您的平台上产生不同的结果,但两者都是 UB。

关于c++ - 双重免费或损坏(如果重新订购行则运行正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20904246/

相关文章:

c++ - 如何在所需值之前输出学生姓名?

c++ - _SH_SECURE 和 _SH_DENYWR 有什么区别

c++ - 在模板中创建复制链表的函数时遇到问题

c++ - 固定大小的容器,其中元素已排序并可以提供指向 C++ 中数据的原始指针

c++ - 通过解析Makefile检索使用的头文件和源文件名

c++ - 为什么阅读不是线程安全的?

依赖于特定类类型的 C++ 模板方法?

c++ - 如何在指针初始化为数组的第一个索引后释放指针?

c++ - 不平衡随机数发生器

c++ - 在优化代码中是否调用了一个空函数?