【问题标题】:Double free or corruption when trying to clear memory in c++尝试在 C++ 中清除内存时出现双重释放或损坏
【发布时间】:2018-03-20 04:00:22
【问题描述】:

我正在编写一个释放指针数组的函数,但是当我调用该函数时,出现运行时错误“双重释放或损坏(fasttop)”。该函数的目的是清除从输入文件中获取数据的数组,如果文件已经打开并且再次调用 fillArray 函数。

这是导致问题的函数:

void freeArray(Country ** g_countryArray)
{
    for (int i = 0; i < g_arrsz; ++i)
    {
        delete [] g_countryArray;
    }
}

据我所知,如果在程序的任何地方调用它,都会导致程序崩溃。我已经运行了调试器,但没有足够的经验来理解输出。如果有帮助,我可以从中发布信息。

【问题讨论】:

  • 为什么要多次删除同一个指针?这是没有意义的。一个就够了;第二次表现出未定义的行为。
  • 您的问题是g_arrsz&gt;1。那,你的函数几乎肯定会做错事,因为它删除了一个指针数组,而不是指针指向的内容。好吧,实际上您的问题似乎是您不知道任何 C++ 或 C 并且正在使用指向指针的指针。不用等!您的直接问题是缺少minimal reproducible example。基本上你有 99 个问题,而这个问题不能解决所有问题。
  • 感谢您指导制定更好的答案。是的,我正在学习 C++,所以不,我不是专家。为什么你暗示指向指针的指针不好?这是用于类分配,使用指向指针的指针是要求的一部分...
  • 另外,'它删除一个指针数组而不是指针指向的内容'是什么意思?我需要删除指针的地址,而不是指针本身吗?
  • 看起来您正在尝试使用数组数组。很可能您必须先删除所有内部维度数组,然后再删除外部维度数组。这只是猜测。要提供真正的答案,我们需要minimal reproducible example

标签: c++ pointers memory-management memory-leaks


【解决方案1】:

您在循环体中遗漏了[i]。如果各个指针指向单个 Country 对象,则需要删除 []

您可能delete[]整个数组;这取决于您的其余代码。

【讨论】:

  • 有一个 Country 对象数组,这是我需要删除的,所以我相信我现在已经完成了。
  • @SethTaylor:您的数据类型与Country 对象的数组不对应,这些对象将由单级Country* 标识。
【解决方案2】:

delete [] g_countryArray; 更改为delete g_countryArray[i];

delete [] arr 一次删除整个数组。

【讨论】:

  • 好的,'delete [] g_countryArray' 和 'delete g_countryArray[i]' 这两个语句在这种情况下可以互换吗?
  • 没有。不可互换。第一个:{删除所有数组元素};第二个:{删除第i个元素}。对于第二个,您需要遍历每个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多