я на Ubuntu 14.04 с помощью GCC 4.8.4 и у меня есть код, подобный следующему:Когда std :: shared_ptr выпускает свой объект?
std::shared_ptr<MyClass> my_shared_object = set elsewhere...
MyFunction(*my_shared_object);
Где MyFunction
«s подпись выглядит следующим образом:
void MyFunction(const MyClass& my_object)
Полный код может быть found here
Однако, я нахожу, что 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' сигнализирует предполагаемое поведение совместного владения. – Snps
Общий указатель действителен до и после вызова функции (следовательно, ссылка тоже), если не будет глупого в другом месте .... –
@Snps Я согласен с тем, что ваше решение устранит проблему. Тем не менее, я также чувствую, что @ ответ Дитера должен быть правильным, а '' my_shared_object'' не выходит из контекста, пока не вернется '' MyFunction''! Поэтому я думаю, возможно, компилятор каким-то образом переопределяет его. – kip622