0

我知道有很多问题与“ * 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 容器手册。

4

1 回答 1

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堆栈上的某些内容。

于 2011-04-28T10:10:33.927 回答