为啥会发生这种双释放错误?

Posted

技术标签:

【中文标题】为啥会发生这种双释放错误?【英文标题】:Why does this double-free error happen?为什么会发生这种双释放错误? 【发布时间】:2014-10-08 19:49:34 【问题描述】:

我有一个基类和一个派生类:

在 A.h 中:

//Includes
class A 
    protected:
       static std::string a;
       //other dummy code
;

在 A.cpp 中

std::string A::a = "bar";
//other dummy code

在 B.h:

#include "A.h"
//Other includes
class B : public A 
    public:
        int c;
        //other dummy code
;

Main.cpp:

#include "A.h"
#include "B.h"

int main() 
   printf("foo");
   return 0;

现在我将 A.cpp 和 B.cpp 编译为两个独立的共享库,分别为“a.so”和“b.so”,然后将它们链接到 Main.cpp。当我运行程序时 - 它以损坏的双链表错误退出。使用 valgrind 运行我看到有一个无效的免费错误。为什么会这样?

我知道每个 .so 文件都必须有自己的静态全局变量副本,但是当派生类在不同的共享库中而基类在不同的共享库中并且在基类?如何跨存在派生类的库为基类中的静态变量分配/销毁内存?

【问题讨论】:

我制作了您描述的可构建版本,并且没有损坏的双链表错误。 Valgrind 没有报告错误。您可能需要提供有关您的平台、工具链和确切构建步骤的更多详细信息。 没有 MCVE,没有有用的答案。 【参考方案1】:

我了解每个 .so 文件都必须有自己的静态全局变量副本

您理解错误,除非您将 A.o 链接到 a.so 和 b.so 中,否则每个 .so 文件都不会拥有自己的静态 A::a 副本。 A.o 应该只链接到 a.so,b.so 应该链接到 a.so,而不是 A.o

【讨论】:

以上是关于为啥会发生这种双释放错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥释放内存会导致分段错误?

为啥保留循环泄漏内存?

为啥使用 realloc() 时会出现双重释放或损坏错误?

具有大量自动释放对象的线程如果是/否,在这种情况下是不是必须使用自动释放池,为啥?

双释放错误释放 1000 个字节

如果二维数组不是双指针,那么为啥会发生这种情况?