这是否包含内存泄漏

Does this contain a memory leak?

本文关键字:泄漏 内存 包含 是否      更新时间:2023-10-16

下面的代码是否包含内存泄漏。我怀疑它确实存在,但我用来检测它们的工具(Visual Studio+Parasoft c++测试(并没有标记出任何东西。如果是这样,我该怎么修?

//A dynamically allocated array of char pointers
int numOfStrings = 10, numOfChars = 32;
char** data = new char*[numOfStrings];
//Generate each each individual string
for(int i = 0; i <numOfStrings; i++)
    data[i] = new char[numOfChars];
//moves the elements 1-5 in the array to the right by one
int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars);
memmove(&data[index + 1],&data[index],sizeToMove);
delete[] data;

编辑:

我应该提到的是,我已经尝试过如下对每个单独的字符串进行迭代,但出现了异常。

for(int i = 0; i< numOfStrings; i++)
    delete [] data [i];
是的。删除时
delete[] data;

您正在释放为数据分配的内存。然而,内存分配

data[i] = new char[numOfChars];

仍然没有被释放。

在删除数据之前,您必须迭代data并删除每个data[i]

一般情况下,您应该确保拥有与new一样多的delete
这里有numOfStrings + 1 new,只有一个delete

还有一次泄漏

既然你在做

int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars);
memmove(&data[index + 1],&data[index],sizeToMove);

(你没有像你想象的那样移动五个位置,而是移动四个位置(5 - 1 = 4)(

此操作后

data[2] will get the value of data[1]
data[2] <- data[1]
data[3] <- data[2]
data[4] <- data[3]
data[5] <- data[4]

并且data[5]所指出的内容将丢失
data[2], data[1]将具有相同的值(指向相同的位置(

这也可以解释为什么当您想通过迭代data 来删除时会出现segfault

规则是:对于每个"new",必须有一个相应的"delete"调用。你没有,所以你有一个漏洞。

是的,您有泄漏!

您必须先删除数组中的每个指针,然后再删除指向它们的指针。

//delete each array
for(int i = 0; i <numOfStrings; i++)
    delete[] data[i];
//this is a single pointer, not an array
delete[] data;

现在您不会有泄漏