Sno*_*man 1 c++ constructor heap-corruption
以下代码导致断言错误.此外,警告错误消息表示检测到堆损坏.
class A {
int* a; // dynamic array of ints
A() {};
A(int size) {
a = new int[size];
}
~A() {
delete [] a;
a = nullptr;
}
}
*** in code somewhere ***
int size = 5;
A temp = A(size);
Run Code Online (Sandbox Code Playgroud)
错误的原因是:
临时= A(大小);
这一行称为:
然后,当临时变量超出范围时,将再次调用其析构函数,从而导致断言失败.
解决方案:
1.温度(大小);
而不是A temp = A(大小);
这只会调用参数化的构造函数.
或
2.覆盖默认的复制构造函数以创建深层复制!
另一种校正由马可·科斯塔
这是更好地初始化一个默认构造函数nullptr.另一种校正由user4581301
析构函数应该检查,如果一个是nullptr,在删除之前.
附加读物:
1.为什么默认情况下没有使用NULL初始化指针?
2. 三阶规则与C++ 11一起成为五次规则? 由Chad 建议
.标量删除 Chad建议的析构函数问题