0

下面的代码是否包含内存泄漏。我怀疑确实如此,但我用来检测它们的工具(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];
4

3 回答 3

2

是的,它确实。当你删除

delete[] data;

您正在释放为数据分配的内存。但是分配的内存

data[i] = new char[numOfChars];

仍然没有被释放。

在删除数据之前,您必须遍历data并删除每个。data[i]

一般来说,你应该确保你有尽可能多deletenews。
在这里,您numOfStrings + 1 new只有一个 s 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

于 2013-04-01T18:40:50.567 回答
1

规则是:对于每个“新”,必须有一个相应的“删除”调用。你没有那个,所以你有泄漏。

于 2013-04-01T18:43:55.507 回答
1

是的,你有泄漏!

在删除指向它们的指针之前,您必须删除数组中的每个指针。

//delete each array
for(int i = 0; i <numOfStrings; i++)
    delete[] data[i];

//this is a single pointer, not an array
delete[] data;

现在你不会有泄漏

于 2013-04-01T18:40:16.153 回答