【问题标题】:Does this contain a memory leak? [closed]这是否包含内存泄漏? [关闭]
【发布时间】:2013-03-22 21:05:02
【问题描述】:

下面的代码是否包含内存泄漏。我怀疑确实如此,但我用来检测它们的工具(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];

【问题讨论】:

  • @NuclearGhost:不,不应该。这个问题是关于识别和纠正一段代码中的特定问题。代码审查适用于当您有一段代码需要在任何领域提出改进建议时。
  • 不要使用new;最好使用std::vector,或者chars的情况下,std::string

标签: c++ memory-leaks new-operator dynamic-memory-allocation memmove


【解决方案1】:

是的,你有泄漏!

在删除指向它们的指针之前,必须先删除数组中的每个指针。

//delete each array
for(int i = 0; i <numOfStrings; i++)
    delete[] data[i];

//this is a single pointer, not an array
delete[] data;

现在你不会有泄漏

【讨论】:

  • 这是我最初认为我应该做的,但是当我进入 for 循环时它会导致异常。
  • 我不明白您的第二条评论以及您为什么将delete[] data; 更改为delete data; -- 是的,它是单个指针,而不是数组。不要在数组上使用deletedelete[],而是在指针上使用它们。但它指向动态分配数组的第一个元素。 char** data = new char*[numOfStrings]; -- 所以delete[] data; 是正确的。
【解决方案2】:

是的。删除时

delete[] data;

您正在释放为数据分配的内存。但是分配的内存

data[i] = new char[numOfChars];

仍未被释放。

在删除数据之前,您必须遍历 data 并删除每个 data[i]

通常,您应该确保deletes 与news 一样多。
这里您有numOfStrings + 1 news 和只有一个delete

又一次泄露

既然你在做

int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars);
memmove(&data[index + 1],&data[index],sizeToMove);

(你并没有像你想象的那样移动五个位置,而是移动四个位置(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 删除时遇到段错误

【讨论】:

  • 我已经尝试过这样做,但发生了异常。我已经用代码更新了原始帖子。
  • 你应该在删除data之前这样做
  • 那是我试的时候放的地方。这是导致异常的循环内第一次调用 delete[] data[i]
  • 我又编辑过了。
【解决方案3】:

规则是:对于每个“新”,必须有一个相应的“删除”调用。你没有那个,所以你有泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2011-02-20
    • 2013-08-12
    相关资源
    最近更新 更多