【问题标题】:glibc detected double free or corruptionglibc 检测到双重释放或损坏
【发布时间】:2012-06-23 23:52:43
【问题描述】:

我遇到了 glibc 检测到的问题。我已经研究了一种解决此问题的方法,但是似乎正确的解决方案是释放我分配的任何内容。但是,即使我这样做了,我仍然会在输出屏幕上收到内存映射打印。

class TestDepth{
    gameStatus temp;
public:
    TestDepth(gameStatus &currentGameState)
    {
        temp = currentGameState;

        free(&temp);
    }
};

我只在放置temp=currentGameState 行时收到此错误。但是,一旦我将其注释掉,它就可以正常工作。

【问题讨论】:

  • free 只有你 mallocated。 free(& 通常是一个错误。
  • 而在 C++ 中,几乎不需要使用 free(或 malloc/calloc)。

标签: c++ glibc


【解决方案1】:

如您所见,我遇到了 glibc 检测到的问题。我研究了一种解决此问题的方法,但似乎正确的解决方案是释放我分配的任何内容。

你没有分配任何东西。你不应该释放任何东西。

【讨论】:

  • 哦!克。所以我需要先分配,然后再复制信息?
  • @RommelAlonzo:不!数据成员temp 的空间已经存在,因为包含它的实例已经存在。构造函数填充已经存在的对象。没有什么可分配的。
  • 好的,那么我需要做什么来复制从 currentGameStatus 对象带来的信息?
【解决方案2】:

temp = currentGameState;

这将调用gameStatus 的赋值运算符(默认或您的版本)。如果调用了默认赋值运算符,那么就可以完成一些明智的赋值。如果currentGameState 对象中有一些堆资源,这是很危险的。如果有gameStatus 的赋值运算符,希望您已经完成了所需的深层复制。

无论哪种方式,您都不应该使用free 来释放对象temp。一个原因是这不是释放对象的正确方法。另一个原因是这可能会尝试释放不是由malloc 分配的东西。

【讨论】:

  • temp = currentGameState; 不调用 gameStatus 复制构造函数。数据成员temp 已经被这行代码执行时默认构造了。语句temp = currentGameState; 改为调用gameStatus 赋值运算符。要调用复制构造函数,需要将temp(currentGameState) 放入构造函数的初始化列表中。
  • @DavidHammen,你是对的,temp 将在构造函数执行的时间体中默认构造。我只是没想到!更正了我的答案,谢谢...
【解决方案3】:

你没有释放你认为你正在释放的东西。当您分配给 temp 时,您将分配给 gameStatus 的副本 - 它不是来自堆。您不是在删除作为参数传入的 GameStatus 版本,而是在删除一个副本。

跳过对 temp 的分配,然后做

free( &currentGameState );

【讨论】:

  • 这里需要()free 是一个普通的 C 函数。与 C++ 运算符 delete 不同。
  • 谁知道temp 是否在堆栈中?我们只知道它与TestDepth 实例位于同一个位置。
  • 你是对的。但是您可以确定 temp 不在堆给定的地址上,这确实是我的观点。我会修复答案
  • -1。跳过临时任务?这是一个构造函数。要跳过的是free 语句。
  • 我认为他想删除构造函数中传递的参数,并使构造的类保持活动状态。我确信这是一个更大功能的废料。我敢打赌,目的是制作传入参数的临时副本,用它来构造 TestDepth,然后删除参数。但他正在删除可能不应该首先创建为类成员的临时对象。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多