Я на 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
будет сохраняться до тех пор, пока используется разыменование?
Чем бы ни управлял std::shared_ptr
будет уничтожен в тот момент, когда нет std::shared_ptr
оставив заявление, все остальные способы его обращения не имеют значения.
А локальные переменные уничтожаются только при выходе из соответствующей области. Разыменование std::shared_ptr
не изменяет его в любом случае.
std::shared_ptr
не знает о вашей ссылке (или ваша ссылка не знает о std::shared_ptr
) к удерживаемому объекту, он знает только о других std::shared_ptr
разделение прав собственности на один и тот же объект. Поэтому, как только последний std::shared_ptr
выходит из области видимости, объект разрушается, и в итоге вы получаете висячую ссылку.
Однако, это не должно иметь место здесь и ваш std::shared_ptr
должен быть должным образом разрушен после того, как поток программы покинет свою область, что, как я не понимаю, может произойти до вызова MyFunction
,
std :: shared_ptr поддерживает внутренний счетчик ссылок. Это количество соответствует количеству объектов, разделяющих объект.
Каждый раз, когда shared_ptr выходит из области видимости, внутренний счетчик ссылок уменьшается.
когда счетчик внутренних ссылок падает до нуля, память освобождается.