Я несколько часов дергал себя за волосы, пытаясь понять загадочное сегфо. Точно такой же код работает в моем конструкторе объектов, но не в методе объекта, где он должен быть: я получаю segfault во время выполнения.
Надеюсь, я не обрезал ничего актуального
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, более или менее то, что я написал выше, и поэтому я так озадачен, как вы, кажется, (или наоборот!). Я использую жестко закодированные значения для отладки, не полагаясь на идентификатор, переданный методу. Если я закомментирую строку вставки, приложение работает нормально. Std :: cout над ним печатает, а ниже не печатает. Обратный след говорит что-то о std :: less, что я не понимаю. Я сделал все возможное, чтобы подвести итог проблемы. Я уже потратил много часов на это, и я действительно озадачен. Я ценю ваше понимание и вашу помощь. Если понадобится, я подумаю о более радикальных и трудоемких способах отладки приложения … А пока …
Задача ещё не решена.
Других решений пока нет …