我的代码如下,其中包含动态字符串数组。我在解除分配生成的每个字符串时遇到问题。我假设我可以只包括一个新的for循环,它取消分配它们但是没有用。我该怎么做?
//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);
for(int i=0;i < numOfStrings; i++)
delete [] data[i]; //this line is causing an exception on its first call (I've also tried delete data[i].
delete[] data;
答案 0 :(得分:2)
除了它的名字所暗示的,memmove
实际上并没有“移动”字节。它会复制它们(但是,与memcpy
相反,即使源和目标区域重叠,它也能正确执行此操作。)
因此,在将内容从源区域“移动”到目标区域之后,位于非重叠部分中的那些元素仍然保持不变。特别是,data[index]
未更改,因此与data[index+1]
之后memmove()
的内容相同。
因此,对delete [] data[index+1]
的任何尝试都会尝试释放在执行delete [] data[index]
时释放的相同内存。这是非法的。
要解决此问题,您需要在移动后将data[index]
(或一般来说,源区域的任何非重叠部分)设置为0
(或nullptr
),或者采取其他措施确保不删除。
给出代码的最简单的直接修复是插入
data[index] = 0;
在删除循环之前。