以下代码是否包含内存泄漏。我怀疑它确实如此,但我用来检测它们的工具(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];
答案 0 :(得分:2)
是的。当您删除
时delete[] data;
您正在释放为数据分配的内存。但分配的内存
data[i] = new char[numOfChars];
仍然没有被释放。
在删除数据之前,您必须迭代data
并删除每个data[i]
。
通常,您应该确保delete
与new
一样多。{。}
此处您有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)
规则是:对于每个'新',必须有相应的'删除'调用。你没有,所以你有泄漏。