2

我有下面的代码,其中包含一个动态的字符串数组。我在解除分配生成的每个单独字符串时遇到问题。我以为我可以只包含一个新的 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;
4

1 回答 1

2

除了它的名字所暗示的,memmove实际上并没有“移动”字节。它复制它们(但是,与 相比memcpy,即使源区域和目标区域重叠,它也可以正确执行此操作)。

因此,在将内容从源区域“移动”到目标区域之后,那些位于不重叠部分的元素仍然保持不变。特别是 ,data[index]是不变的,因此与data[index+1]你之后的内容相同memmove()

因此,任何尝试都delete [] data[index+1]将尝试释放在执行delete [] data[index]. 那是违法的。

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

给定您的代码,最简单的直接修复是插入

data[index] = 0;

在删除循环之前。

于 2013-04-04T02:05:44.707 回答