glibc 检测到双重释放或损坏

  • 本文关键字:释放 损坏 glibc c++ glibc
  • 更新时间 :
  • 英文 :


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

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

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

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

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

temp = currentGameState;

这将调用gameStatus 的赋值运算符(默认或您的版本)。如果调用默认赋值运算符,则按位赋值将完成。如果对象currentGameState有一些堆资源,这是危险的。如果有 gameStatus 的赋值运算符,希望您已经完成了所需的深度复制。

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

你没有释放你认为你在释放的东西。当您分配给临时时,您将分配给游戏状态的副本 - 该副本不是来自堆。您不会删除作为参数传入的 GameStatus 版本,而是删除副本。

跳过临时作业,只做

free( &currentGameState );

最新更新