双重免费或损坏(如果重新排序行,则运行正常)

use*_*598 1 c++

使用链接中的示例,但更改为使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

Test t;
vector<Test> q;
Run Code Online (Sandbox Code Playgroud)

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

在Xubuntu 12.04 g ++ 4.6.3上测试.

更新:

这不是重复的问题.我理解需要一个复制构造函数和赋值运算符(它已在上面的示例代码所在的链接中得到了解答).但是,在原始链接中使用int *queue类似,但交换第1行和第2行仍然存在错误.仅在使用char *,并且vector和交换1号线和2号线会不会导致错误.我的问题是为什么这个特例?任何人都可以在您的平台上查看它吗

jua*_*nza 8

您的类型管理资源(动态分配的数组),但不实现三个规则.当你这样做:

q.push_back(t);
Run Code Online (Sandbox Code Playgroud)

q制作t它拥有的副本.所以现在你有一个对象的两个副本引用相同的数据,并试图调用delete它.

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

调用delete[]已删除的数组是未定义的行为(UB).这意味着有时您的程序似乎有效.您不能依赖具有未定义行为的程序来执行任何操作.交换行1和2反转其中的顺序t并被q销毁.这似乎会在您的平台上产生不同的结果,但两者都是UB.

  • @Groo它是未定义的行为,所以它似乎"工作". (2认同)