我知道有很多问题“ * 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容器手册。
答案 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
堆栈中的东西。