双重免费或腐败(如果重新排序,则运行正常)
这个问题在这里已经有了答案:
你的类型管理资源(一个动态分配的数组),但没有实现三的规则。 当你这样做时:
q.push_back(t);
q
制作一份它拥有的t
的副本。 所以现在你有两个引用相同数据的对象副本,并尝试在其中调用delete
。
您需要实现复制构造函数和赋值运算符。 或者使用管理自己资源的类,例如std::string
或std::vector
。
在已经删除的数组上调用delete[]
是未定义的行为(UB)。 这意味着有时候你的程序似乎可以工作。 你不能依赖具有未定义行为的程序来做任何事情。 换行1和2颠倒了t
和q
被破坏的顺序。 这似乎会在您的平台上产生不同的结果,但都是UB。
当您push
其push
送到矢量时,C ++会自动生成一个Test
对象的浅表副本。 当向量超出范围并被破坏时, myArray
指针是delete[]
d。 然后,当Test超出范围时,同样的指针会再次被delete[]
d。
您应该指定一个复制构造函数并对该对象进行深层复制。 随着一个新的阵列。
也强烈建议重载赋值运算符(在上面的同一链接中解释)。
因为你需要一个拷贝构造函数。
push_back
复制参数,并且因为您没有提供复制构造函数,所以有一个默认值,制作一个浅拷贝(只拷贝指针,没有内容*)
所以,你需要定义一个
Test( const Test& other )
{
// ...
}
Test& operator=( const Test& other ) // just in case
{
// ...
}
并进行深层复制,手动复制char*
缓冲区。
*)会导致双重删除 - 一次来自t
的析构函数,一次来自q
的析构函数(它调用向量中所有元素的析构函数)