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
导致“写到堆缓冲区的内存末尾”错误。我究竟做错了什么?我也应该删除吗?
答案 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个元素!
您正在溢出数组并破坏了堆!