这是否包含内存泄漏?

时间:2013-04-01 18:36:02

标签: c++ memory-leaks new-operator dynamic-memory-allocation memmove

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

3 个答案:

答案 0 :(得分:2)

是的。当您删除

delete[] data;

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

data[i] = new char[numOfChars];

仍然没有被释放。

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

通常,您应该确保deletenew一样多。{。} 此处您有numOfStrings + 1 new个且只有一个delete

又一次泄漏

因为你正在做

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

(你并没有像你想象的那样移动五个地方,而是移动了4个地方(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来删除时出现段错误

答案 1 :(得分:1)

是的,你有泄漏!

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

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

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

现在你不会有泄漏

答案 2 :(得分:1)

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