一般来说,什么会导致不包含任何动态内存分配的程序中的双重释放?
更准确地说,我的代码都没有使用动态分配。我正在使用 STL,但这更有可能是我做错的事情,而不是 G++/glibc/STL 的错误实现。
我四处搜索试图找到这个问题的答案,但我找不到任何在没有任何动态内存分配的情况下生成此错误的示例。
我很想分享产生这个错误的代码,但我不允许发布它,我不知道如何将问题减少到足够小,可以在这里给出。我会尽力描述我的代码在做什么的要点。
离开函数时抛出错误,堆栈跟踪显示它来自 a 的析构函数std::vector<std::set<std::string>>
。向量中的一些元素正在被初始化emplace_back()
。在最后一次尝试中,我将其更改为push_back({{}})
,问题就消失了。通过设置环境变量MALLOC_CHECK_=2也可以避免该问题。据我了解,该环境变量应该导致 glibc 中止并提供更多信息,而不是导致错误消失。
这个问题只是为了满足我的好奇心,所以我会在黑暗中回答。我能想到的最好的结果是它是一个编译器错误,但这总是我的错。