检测到glibc:free():无效指针:带有简单的boost :: ptr_map示例

时间:2011-04-28 10:00:27

标签: glibc boost-ptr-container

我知道有很多问题“ * glibc检测到* free():指针无效”,但以下是使用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..

在整个过程中一直重复这种错误是在尝试删除无效指针时引起的。但是,上述非常简单的代码中的哪些更改可以避免此错误?

这个问题的背景是我正在努力理解boost :: ptr_map的正确用法。不幸的是,就ptr_map而言,官方的boost文档非常稀疏(没有教程,没有ptr_map的例子)。没有boost :: ptr_map教程似乎存在于网络上。我在检索值和访问我创建的映射类的方法时遇到问题。因此,我试图创造出我能做到的最简单的例子,但是如上所述,开局不顺利。

对于上面的glibc错误和ptr_map的任何帮助都是值得赞赏的。感谢。

编辑: 我阅读了20多次,研究并复制了官方助推教程中的例子http://www.boost.org/doc/libs/1_46_0/libs/ptr_container/doc/tutorial.html 如上所述,boost教程几乎不涉及ptr_map,因此链接到它不会有任何区别。基本上,我已经多次通过整个提升ptr容器手册。

1 个答案:

答案 0 :(得分:1)

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

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