2014-07-17 2 views
0

Допустим, у меня есть следующие:Условия для удаления ЗППП :: shared_ptr

class Bar 
{ 
    public: 
     int i; 
}; 

class Foo 
{ 
    public: 
     std::vector<std::shared_ptr<Bar>> vector; 
}; 

class FooBar 
{ 
    public: 
     std::shared_ptr<Bar> myBar; 
}; 

int main() 
{ 
    Foo foo; 
    FooBar foobar; 

    foobar.myBar = std::make_shared<Bar>(); 

    foo.vector.push_back(foobar.myBar); 

    foobar.myBar = nullptr; 
} 

ли как myBar и foo.vector.back() равна nullptr? Они оба были удалены? Каким будет правильный способ сделать это? Мой endgoal должен иметь вектор указателей на объекты, создавать объекты и помещать их в этот вектор из другой области видимости, затем в область, которую они были созданы при их удалении, и удалить их из вектора. Мой мыслительный процесс заключается в том, что я могу как-то легко удалить все экземпляры указателя, тогда я могу просто проверить каждый кадр, чтобы удалить shared_ptr из вектора, если он равен nullptr.

+3

Никогда не называйте переменные такими же, как стандартные классы, т. Е. 'Vector'. –

+0

Нет, только 'myBar' равно null. 'foo.vector.back()' все еще содержит ссылку на общий объект. Вот почему он называется 'shared_ptr'. Вы можете легко проверить это, добавив конструкторы (включая копирование и перемещение) и деструктор для «Бар» и напечатайте сообщения от них. –

ответ

4

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

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

+1

Удостоверьтесь, что ** object **, который копируется, является 'shared_ptr' здесь, а не' Bar'. OP кажется новым и может легко неверно истолковать ваш ответ. Он мог подумать, что «Бар» скопирован на вектор. – gexicide

+0

@gexicide thanks, я сделал редактирование, которое должно прояснить ситуацию. –

+0

Итак, я создаю вектор weak_ptr, но создаю объекты как shared_ptr, а затем устанавливая shared_ptr на что-то еще, например nullptr, приведет к истечению срока действия weak_ptr. Это похоже на то, что мне нужно, спасибо. – user2941616

0

При создании std::shared_ptr, есть выбор:

  • Создать пустой shared_ptr
  • АКЦИЮ претензии некоторых других shared_ptr или weak_ptr.
  • Настройте новое требование.

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

Очистка вызывается только в том случае, если последний истец освобождает свою заявку, (weak_ptr учитывает только объект управления).

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

Смежные вопросы