在memmove后删除[]时出现异常

Exception during delete[] after memmove

本文关键字:异常 memmove 删除      更新时间:2023-10-16

下面的代码包含一个动态字符串数组。我在释放生成的每个字符串时遇到了问题。我假设我可以包含一个新的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;

除了它的名字所暗示的,memmove实际上并不"移动"字节。它复制它们(但是,与memcpy相反,即使源区域和目标区域重叠,它也可以正确地完成此操作)。

因此,在将内容从源区域"移动"到目标区域后,那些位于非重叠部分的元素仍然保持不变。其中,data[index]不变,因此与memmove()后的data[index+1]含量相同。

因此,任何对delete [] data[index+1]的尝试都将尝试释放与执行delete [] data[index]时释放的相同的内存。这是非法的。

要解决这个问题,需要在移动后将data[index](或者一般来说,源区域的任何不重叠的部分)设置为0(或者nullptr),或者采取其他措施确保其不被删除。

最简单的直接修复方法是插入

data[index] = 0;