Загадочное сегфо при вставке в ptr_map

Я несколько часов дергал себя за волосы, пытаясь понять загадочное сегфо. Точно такой же код работает в моем конструкторе объектов, но не в методе объекта, где он должен быть: я получаю 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, что я не понимаю. Я сделал все возможное, чтобы подвести итог проблемы. Я уже потратил много часов на это, и я действительно озадачен. Я ценю ваше понимание и вашу помощь. Если понадобится, я подумаю о более радикальных и трудоемких способах отладки приложения … А пока …

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector