Векторы std :: shared_ptr потерять данные - PullRequest
0 голосов
/ 11 января 2011

Я пытаюсь построить std::vectors и std::maps из std::shared_ptrs, но они, похоже, имеют привычку терять данные. Под этим я подразумеваю, что когда я нажимаю std::shared_ptrs в них, некоторые из них удаляют данные, на которые они указывают.

В частности, первый std::shared_ptr, который будет помещен в std::vector, удаляется. Это сбивает с толку, так как нажатие std::shared_ptr на std::vector должно увеличивать счетчик ссылок, пока исходный std::shared_ptr не выйдет за рамки, правильно? Кажется, что никакие другие std::shared_ptrs не удаляются, но я не могу проверить, пока не решу эту проблему, поскольку она проверяет значения путем итерации.

Я прошу прощения, если я не объяснил себя достаточно хорошо. Я все еще приспосабливаюсь к этому сайту.

РЕДАКТИРОВАТЬ: Здесь является кодом для двух соответствующих классов. Проблема должна лежать в функциях-членах Load. Он довольно большой, так как это анализатор файлов, поэтому я не могу сказать, в чем проблема. Значение - это переменная-член, которая является std::vector<std::shared_ptr<NBT::Tag::Base>> для списка и std::map<std::string, std::shared_ptr<NBT::Tag::Base>> для соединения.

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Запустите вашу программу через valgrind , чтобы найти источник ошибки segfault.

2 голосов
/ 11 января 2011

Вы не можете просто сконструировать волен-неволей shared_ptr, они должны быть сконструированы друг из друга, иначе они думают, что они единственные, кто владеет shared_ptr, и удаляют объект, когда выходят из области видимости.Если вы хотите иметь возможность создавать shared_ptr напрямую из объекта, вам нужно наследовать от enable_shared_from_this<Type>.Я не могу легко прочитать ваш код (их там много), но ваши симптомы звучат так, будто вы их неправильно истолковали.

...