无法删除类指针

时间:2019-10-29 16:55:21

标签: c++ dynamic-memory-allocation

Class Example
{
    // ...
};

int main()
{
    Example** pointer = new Example*[9];

    for(int i = 0; i < 10; i++)
    {
        pointer[i] = new Example();
    }

    for(int i = 0; i < 10; i++)
    {
        delete pointer[i];
    }

    delete[] pointer; // <--- This is problem
    pointer = nullptr;
}

我试图将对象的地址保存在数组中。当我尝试删除它们时,for循环工作得很好,但是delete[] pointer导致“写到堆缓冲区的内存末尾”错误。我究竟做错了什么?我也应该删除吗?enter image description here

3 个答案:

答案 0 :(得分:5)

您的数组太小:

Example** pointer = new Example*[9];

您正在分配9个元素,这意味着它们的索引为0、1、2,...,8。

在这里的循环中:

 pointer[i] = new Example();

在这里:

 delete pointer[i];

您正在访问pointer[9],因为您的循环条件是i < 10。这超出范围,访问该值会导致未定义的行为。

相反,创建一个包含10个元素的数组:

Example** pointer = new Example*[10];

答案 1 :(得分:3)

您的代码具有未定义的行为。

您正在为该行中的9个指针分配空间

  Example** pointer = new Example*[9];

但是正在其后的循环中访问10个指针。

更改该行以分配10个指针来解决此问题。

  Example** pointer = new Example*[10];

答案 2 :(得分:2)

您的数组包含9个元素。 您的分配循环(新)和解除分配(免费)尝试创建/销毁10个元素!

您正在溢出数组并破坏了堆!