предотвратить std :: set от удаления памяти - PullRequest
0 голосов
/ 24 мая 2011

Есть ли способ предотвратить функцию std::set< Object*>.erase(it) для удаления памяти?Я только хочу, чтобы Object* был удален из набора без освобождения памяти.

Если говорить точнее, у меня есть объект, который удаляет себя из набора и помещает себя в другой.И он падает.

set1.insert(this);    
set1.erase(set1.find(this));
set2.insert(this);

Кто-нибудь может воспроизвести это?спасибо!

Ответы [ 4 ]

10 голосов
/ 24 мая 2011

Поскольку вы храните необработанные указатели в наборе, вам не нужно делать ничего особенного: память не будет освобождена при вызове erase.

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

2 голосов
/ 24 мая 2011

Ваш set<Object*> уже не удаляет указанный объект, когда вы вызываете стирание для итератора.Если он падает в этой области, это по другой причине.Возможные причины:

  • Вы используете итератор после удаления элемента.
  • Отсутствует / неверный деструктор.
  • Отсутствует / неверный конструктор копирования / назначение копированияoperator.
  • Несвязанные проблемы с кучей, такие как двойное удаление.
1 голос
/ 24 мая 2011

Это уже то, что происходит.

Элемент & mdash; указатель & mdash; уничтожен Нет волшебства, которое также delete указывает на то, на что оно указывает.

0 голосов
/ 24 мая 2011

Что у тебя в наборе? QObject *? Если это так, erase должен освобождать только ваш указатель, а не экземпляр, на который он указывает ... Вы берете около дерева? Это ваш набор, который вы имеете в виду?

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