【问题标题】:glibc detected : free(): invalid pointer: with simple boost::ptr_map example检测到 glibc:free():无效指针:使用简单的 boost::ptr_map 示例
【发布时间】:2011-08-14 13:57:16
【问题描述】:

我知道有很多关于“* glibc detected * free(): invalid pointer”的问题,但以下是 boost::ptr_map 的极简示例:

#include <boost/ptr_container/ptr_map.hpp>
#include <string>

int main() {
        boost::ptr_map<std::string, int> map;
        int one = 1;
        int* pone = &one;
        string un = "one";
        map.insert(un, pone);
}

代码编译,但在运行时:

boost.library/ptr_container $ ./run.ptrmap
*** glibc detected *** ./run.ptrmap: free(): invalid pointer: 0x00007ffffd5c4578 ***
======= Backtrace: =========
/lib/libc.so.6[0x7fd5e99202f6]
/lib/libc.so.6(cfree+0x6c)[0x7fd5e9924c6c]
./run.ptrmap[0x401066]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7fd5e98c8abd]
./run.ptrmap[0x400e79]
======= Memory map: ========
etc..

在整个 SO 中反复出现这种错误是在尝试删除无效指针时引起的。但是,对上述非常简单的代码进行哪些更改可以避免此错误?

这个问题的背景是我正在努力理解 boost::ptr_map 的正确用法。不幸的是,就 ptr_map 而言,官方的 boost 文档非常稀疏(没有教程,没有 ptr_map 的示例)。网络上似乎没有 boost::ptr_map 教程。我在检索值和访问我创建的映射类的方法时遇到问题。因此,我试图创建一个我能做到的最简单的例子,但正如上面所证明的那样,起步很糟糕。

对于上述 glibc 错误和一般 ptr_map 的任何帮助,我们将不胜感激。谢谢。

编辑: 我已经阅读了 20 多遍,学习并复制了官方 boost 教程http://www.boost.org/doc/libs/1_46_0/libs/ptr_container/doc/tutorial.html 中的示例 如上所述,boost 教程几乎没有涵盖 ptr_map,因此链接到它不会有任何区别。基本上,我已经多次通读了整个 boost ptr 容器手册。

【问题讨论】:

    标签: glibc boost-ptr-container


    【解决方案1】:

    教程:http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/tutorial.html(通过谷歌搜索找到:boost ptr_map

    ptr_map 拥有它给出的指针的所有权,因此需要给它分配堆分配的 (new) 对象。你已经给它一个指向堆栈分配对象的指针,所以当 ptr_map 被清理时,它会尝试delete 堆栈上的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      相关资源
      最近更新 更多