检测到堆腐败 - 带指针的类

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)

Sno*_*man 5

错误的原因是:
临时= A(大小);
这一行称为:

  1. A的复制构造函数,这里:临时= A(大小); 问题是,这会创建一个浅拷贝,因为它使用默认的拷贝构造函数,并且我们在类中有一个指针,需要一个深拷贝!
  2. A的参数化构造函数,这里:A(size) ;
  3. 一个析构函数,它将删除由A temp创建的指针并将其置空.

然后,当临时变量超出范围时,将再次调用其析构函数,从而导致断言失败.

解决方案:

1.温度(大小);
而不是A temp = A(大小);

这只会调用参数化的构造函数.

2.覆盖默认的复制构造函数以创建深层复制!

另一种校正马可·科斯塔
这是更好地初始化一个默认构造函数nullptr.

另一种校正user4581301
析构函数应该检查,如果一个是nullptr,在删除之前.

附加读物:
1.为什么默认情况下没有使用NULL初始化指针?
2. 三阶规则与C++ 11一起成为五次规则? Chad 建议
.标量删除 Chad建议的析构函数问题

  • 此外,您应该在默认构造函数上初始化一个to nullptr. (4认同)