我一直在拉我的头发几个小时试图理解一个令人费解的段错误。完全相同的代码在我的对象构造函数中工作,但不在对象的方法中,它应该是:我在运行时得到一个段错误。
希望我没有剪掉任何相关内容:
stud.hpp:
#include <boost/ptr_container/ptr_map.hpp>
namespace my {
class person {
person(long id); // implemented in another file.
std::string name;
};
class Stud {
Stud();
boost::ptr_map<long, my::person> people;
my::person* by_id(long id);
};
}
stud.cpp:
#include "stud.hpp"
namespace my {
Stud::Stud() {
// debug:
long id = 143; // valid id.
my::person* p = new my::person(id);
people.insert(id, p);
std::cout << "Inserted in constructor. All OK." << std::endl;
}
my::person* Stud::by_id(long id__) {
long id = 142; // valid id.
my::person* p = new my::person(id);
std::cout << p->name << "All OK so far..." << std::endl;
people.insert(id, p); // segfaults.
std::cout << "The application segfaults before arriving here." << std::endl;
return p;
// This method is eventually supposed to check
// if a specific id is present in the map
// and return it if it is.
// Otherwise create the object, insert into the map
// and return the new pointer.
}
}
回溯:
#0 0x00007fffe8d3986f in std::less<long>::operator()(long const&, long const&) const ()
from /usr/local/lib/plugins/libstud.so.0
#1 0x00007fffe8d394a5 in std::_Rb_tree<long, std::pair<long const, void*>, std::_Select1st<std::pair<long const, void*> >, std::less<long>, std::allocator<std::pair<long const, void*> > >::_M_insert_unique(std::pair<long const, void*> const&) ()
请求:为我解决我的问题! ;)
现在,更严重的是:
的的问题:
是否需要在构造函数中以任何方式初始化ptr_map人员?
为什么相同的插入代码在构造函数中起作用而在方法中不起作用?
什么可能导致ptr_map插入段错误地应用程序?
修改:
该应用程序实际上是基于cppcms的应用程序的插件。整个应用程序已经开始变得相当复杂,我无法合理地发布所有内容。但是,我在我的IDE中看到的或多或少是我上面写的,这就是为什么我像你看起来一样困惑(或者反过来!)。我使用硬编码值进行调试,而不是依赖于传递给方法的id。如果我注释掉插入行,应用程序运行正常。它上方的std :: cout打印,但下面的那个没有。回溯说明了std :: less,我不明白。我尽力总结这个问题。我已经花了很多时间在上面,我真的很困惑。感谢您的理解和帮助。如果需要,我会考虑更激烈,更耗时的方法来调试应用程序......同时......