gpt4 book ai didi

c++ - memmove 后 delete[] 期间出现异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:05 26 4
gpt4 key购买 nike

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

在删除循环之前。

关于c++ - memmove 后 delete[] 期间出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com