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