使用链接中的示例,但更改为使用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号线会不会导致错误.我的问题是为什么这个特例?任何人都可以在您的平台上查看它吗
您的类型管理资源(动态分配的数组),但不实现三个规则.当你这样做:
q.push_back(t);
Run Code Online (Sandbox Code Playgroud)
q制作t它拥有的副本.所以现在你有一个对象的两个副本引用相同的数据,并试图调用delete它.
您需要实现复制构造函数和赋值运算符.或者使用管理自己资源的类,例如std::string或std::vector.
调用delete[]已删除的数组是未定义的行为(UB).这意味着有时您的程序似乎有效.您不能依赖具有未定义行为的程序来执行任何操作.交换行1和2反转其中的顺序t并被q销毁.这似乎会在您的平台上产生不同的结果,但两者都是UB.
| 归档时间: |
|
| 查看次数: |
775 次 |
| 最近记录: |