Причина сбоя в std :: set :: insert - PullRequest
3 голосов
/ 10 января 2012

Я пытаюсь отладить проблему, когда наша программа падает (segfault) в методе «addToOurSet» ниже:

class SomeClass {
    // ( ... )
    void addToOurSet(SomeOtherClass* obj) { ourSet.insert(obj); }
    std::set<SomeOtherClass*> ourSet;
};

Сбой трудно воспроизвести из-за (среди прочего, сложности и большого размера данных, а также невозможности воспроизведения в отладочной сборке; приведенный выше пример, очевидно, сильно упрощен). Трассировка показывает сбой, произошедший в:

std::_Rb_tree<...>::insert_unique(SomeOtherClass* const&)

Мой вопрос: что может вызвать сбой метода ourSet.insert(...)? Насколько я понимаю, сам вставленный объект не может вызвать его, поскольку он является указателем. Правильный? Так я смотрю на проблему с самим набором? Очевидно, что если указатель набора по какой-то причине недопустим, вызов может завершиться сбоем, но может, например, какая-то операция с множеством вызвать его таким образом, чтобы он стал недействительным (как, например, удаление после его завершения или что-то, что запрещено)? 1008 *

1 Ответ

3 голосов
/ 10 января 2012

Существует несколько возможностей:

  1. Сам set недействителен (включающий экземпляр SomeClass удален или доступен через висячий указатель и т. Д.).
  2. Где-то повреждена память.

Я бы, вероятно, начал с valgrind или аналогичного инструмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...