Когда std :: shared_ptr освобождает свой объект?

Я на Ubuntu 14.04 с использованием GCC 4.8.4, и у меня есть код, подобный следующему:

std::shared_ptr<MyClass> my_shared_object = set elsewhere...
MyFunction(*my_shared_object);

куда MyFunctionподпись выглядит так:

void MyFunction(const MyClass& my_object)

Полный код можно найти Вот

Тем не менее, я обнаружил, что my_object фактически выходит за рамки контекста MyFunction, Я думал, что my_shared_object выпустит его содержимое только после того, как оно выйдет из области видимости, то есть после MyFunction вернулся. Я не уверен, если я либо недоразумение std::shared_ptr или, может быть, это ошибка GCC.

Я думаю, что вопрос сводится к: когда я разыменую std :: shared_ptr, это гарантирует, что std::shared_ptr будет сохраняться до тех пор, пока используется разыменование?

4

Решение

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

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

5

Другие решения

std::shared_ptr не знает о вашей ссылке (или ваша ссылка не знает о std::shared_ptr) к удерживаемому объекту, он знает только о других std::shared_ptrразделение прав собственности на один и тот же объект. Поэтому, как только последний std::shared_ptr выходит из области видимости, объект разрушается, и в итоге вы получаете висячую ссылку.

Однако, это не должно иметь место здесь и ваш std::shared_ptr должен быть должным образом разрушен после того, как поток программы покинет свою область, что, как я не понимаю, может произойти до вызова MyFunction,

4

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

1
По вопросам рекламы [email protected]