插入ptr_map时出现令人费解的段错误

时间:2013-12-10 08:14:17

标签: c++ segmentation-fault boost-ptr-container

我一直在拉我的头发几个小时试图理解一个令人费解的段错误。完全相同的代码在我的对象构造函数中工作,但不在对象的方法中,它应该是:我在运行时得到一个段错误。

希望我没有剪掉任何相关内容:

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,我不明白。我尽力总结这个问题。我已经花了很多时间在上面,我真的很困惑。感谢您的理解和帮助。如果需要,我会考虑更激烈,更耗时的方法来调试应用程序......同时......

0 个答案:

没有答案