C ++ shared_ptr как удалить pointee с несколькими shared_ptr - PullRequest
0 голосов
/ 12 октября 2010

Я работаю над этим проектом,

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

Как мне решить эту проблему, пожалуйста, помогите.

Ответы [ 2 ]

9 голосов
/ 12 октября 2010

Это по замыслу.Пока объект принадлежит одному или нескольким умным указателям shared_ptr, он не будет уничтожен.Право собственности на объект совместно используется всеми интеллектуальными указателями, которые владеют, и объект нельзя уничтожить, пока все владельцы не покончат с ним.Вот что такое совместное владение.

Если вы хотите иметь возможность уничтожить объект, пока есть ссылки на него, вы можете использовать weak_ptr для этих ссылок.

0 голосов
/ 12 октября 2010

Вы можете уменьшить use_count для shared_ptr, используя метод reset().

Если вы сделаете это для каждого указателя, который содержит экземпляр, последний reset() уничтожит объект, на который он указывает.

shared_ptr<Class> myPointer1( new Class() ); //myPointer holds an instance of Class
shared_ptr<Class> myPointer2 = myPointer1; //use_count == 2
myPointer1.reset(); //use_count == 1
myPointer2.reset(); //instance of class will be destroyed

Но у вас, вероятно, есть проблема с вашим дизайном, shared_ptr должен автоматически выйти из фокуса, когда определенные объекты уничтожены или методы заканчиваются. Возможно, вам следует взглянуть на точки, где shared_ptrs по-прежнему содержит указатели на объект, и проверить, не должны ли они больше удерживать объект.

...