2016-07-16 3 views
-2

Я не знаю, как я могу удалить элемент с .top(), когда у меня есть стек общих указателей.C++ стек общих указателей delete element

Мой класс (что-то вроде этого):

Class 
{ 
public: 
    Class(); 
    ~Class(); 
    void popState(); 

private: 
    std::stack<std::shared_ptr<State> > states; 
} 

void Class::popState() 
{ 
    delete this->states.top(); 
} 

У меня есть ошибка в "удалить this-> states.top()": выражение должно иметь тип указателя.
Как это должно быть написано правильно?

+7

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

ответ

3

Большая часть причин для использования shared_ptr заключается в том, что вы не должны должны удалить объект, на который указывает. Деструктор последнего shared_ptr, который указывает на объект, удаляет объект. Поэтому удалите эту строку delete из деструктора. Вам нечего делать.

+1

* Деструктор последнего shared_ptr или weak_ptr, который указывает на объект, удаляет объект. * Неверно , слабый указатель является ссылкой, не являющейся собственностью. (см. [doc] (http://en.cppreference.com/w/cpp/memory/weak_ptr)). Если в нем была ссылка на объект, вам не пришлось бы конвертировать его в share_ptr для доступа к нему, но вы делаете. – Borgleader

+1

@Borgleader - исправлено. Слишком рано утром. –

+0

Но когда я хочу постить этот элемент следующим образом: this-> states.pop(), то этот общий ptr удаляется автоматически? – nolbek