指针内存泄漏的C++数组

tsu*_*nka 2 c++ valgrind memory-leaks

在我的课上,我有一个动态分配的指针数组.我的声明:

 array = new Elem* [size];
 for (int i = 0; i < size; i++) {
    array[i] = NULL;
 }
Run Code Online (Sandbox Code Playgroud)

所以有一个指针数组,其中每个指针指向一个简单的Elem结构.

主要问题是,我应该如何正确地解除分配数组.如果我只使用:

for (int i = 0; i < size; i++) {
   delete array[i];
}
Run Code Online (Sandbox Code Playgroud)

Valgrind报告1个未释放的块,它被追踪到'array = new Elem*[size];'的行.状态.

另一方面,如果我添加到以前的代码:

delete array;
Run Code Online (Sandbox Code Playgroud)

我认为这是正确的,valgrind报告了0个未释放的块,这是完美的,但它报告

Mismatched free() / delete / delete []
Run Code Online (Sandbox Code Playgroud)

正好在'删除数组;'的行上 是.我也试过'删除[]数组',但那只是"1个未释放的块"!如果有人能够以正确的方式向我解释,我将不胜感激.

编辑: 所以使用:

for (int i = 0; i < size; i++) {
   delete array[i];
}
delete[] array;
Run Code Online (Sandbox Code Playgroud)

工作可能很好.它在我的一个班级(我有两个类似的)工作,另一个仍然报告一些小漏洞.我认为这只是一个小错误,但是valgrind仍然指向那里的线

array = new Elem* [size];
Run Code Online (Sandbox Code Playgroud)

站立.

编辑2: 我也解决了这个问题,谢谢你的贡献!

Mar*_*som 8

你需要:

delete [] array;
Run Code Online (Sandbox Code Playgroud)

因为它是一个数组.

我刚刚注意到你的注意事项,你也试过了 - 这是正确的做法,我不知道为什么你仍然会收到错误.

编辑:这应该得到更彻底的解释.

使用时创建指针时new,指针可能是单个元素或元素数组,具体取决于您使用的语法.但两种情况下指针类型都相同!编译器依赖于您知道指针指向的内容并相应地对其进行处理.

Elem ** single = new Elem*;    // pointer to one pointer
single[0] = new Elem;          // OK
single[1] = new Elem;          // runtime error, but not compile time

Elem ** array = new Elem* [2]; // pointer to array of pointers
array[0] = new Elem;           // OK
array[1] = new Elem;           // OK
Run Code Online (Sandbox Code Playgroud)

删除指针时,将为其指向的对象或数组的每个元素调用析构函数.但由于指针类型在每种情况下都是相同的,编译器依赖于您为其提供正确的语法,因此它知道该怎么做.

delete single;
delete [] array;
Run Code Online (Sandbox Code Playgroud)

在您的情况下,数组的元素也是指针,指针没有析构函数.这意味着这些指针不会被删除,如果你不先删除它们将成为内存泄漏.在最终删除之前,有一个循环可以单独删除它们是正确的.


Pub*_*bby 7

您应该释放数组中的所有内容(如果动态分配),然后释放数组本身.

for (int i = 0; i < size; i++) { // only free inside if dynamically allocated - not if just storing pointers
   delete array[i];
}
delete[] array; // necesarry
Run Code Online (Sandbox Code Playgroud)

  • 该死的,这条线比理发店有更多分裂的头发! (3认同)

Dav*_*nan 5

删除数组的语法如下:

delete[] array;
Run Code Online (Sandbox Code Playgroud)

你的for循环删除数组元素指向的对象是好的.删除数组本身是唯一的问题.您需要两个for循环,然后在delete[]处置数组本身.

for (int i = 0; i < size; i++) {
   delete array[i];
}
delete[] array;
Run Code Online (Sandbox Code Playgroud)

我怀疑你已经尝试过使用for循环,或者是delete[],但不是两者都在一起.如果你这样做仍然有泄漏或错误,那么你需要向我们展示分配作为数组元素的指针的代码.


使用std::vector<>而不是数组意味着你可以不再担心这些细节,而是转向更高层次的抽象.