Справочный параметр срок службы
-
27-10-2019 - |
Вопрос
Учитывая следующее:
class ParamClass {...};
class MyObject {
public:
void myMethod(ParamClass const& param) { _myPrivate = param; }
private:
ParamClass _myPrivate;
}
[...]
MyObject obj;
void some_function(void)
{
ParamClass p(...);
obj.myMethod(p);
}
Что будет с _myprivate в конце срока службы объекта P? РЕДАКТИРОВАТЬ: Смогу ли я использовать _myprivate для доступа к копии объекта P?
Спасибо!
Дэн
Решение
С _myPrivate
является нет Ссылка в присвоении _myPrivate = param
, param
указывает на то, что в этом случае является локальной переменной p
в some_function()
.
Так Если оператор назначения для ParamClass
реализуется правильно, код должен быть в порядке.
Смогу ли я использовать _myprivate для доступа к копии объекта P?
С приведенным выше предостережением, да. Но быть точным, _myPrivate
нельзя использовать для доступ копия p
; Это является переменная, содержащая копию данных в (теперь вымерший) p
.
Другие советы
в myMethod
вы призываете оператора назначения ParamClass
который по умолчанию делает чучевую копию объекта (вы можете определить своего собственного оператора). Таким образом, вы создаете копию P, которая будет доступна
Ссылка похожа на псевдоним объекту. Ссылка не имеет своей жизни. Срок службы срок службы - это время жизни объекта.
В вашем примере _myprivate-это объект, поэтому оператор = скопирует перепроданный objet p. P будет уничтожена, и ссылка на параметр ничего не будет ссылаться на то, что копия будет в порядке.
Было бы проблемой, если бы _myprivate объявлено:
ParamObject& _myPrivate;
В этом случае вы получите «свисание» ссылки: неопределенное поведение :)
my2c
Взгляни на:
_myPrivate = param;
В этом операторе оператора (оператор назначения (ParamClass::operator=
) копирует значения каждого члена объекта, упомянутого param
в члены _myPrivate
. Анкет Когда some_function
возвращается, p
перемещается из стека - он исчезает. Но _myPrivate
теперь содержит копии p
Значения членов.
Если ParamClass
Имеет участники, которые являются указателями на динамически распределенную память, вы должны убедиться, что ParamClass::operator=
выполняет глубокая копия, в противном случае у вас могут быть проблемы с висящими указателями - ParamClass
Дестатель может освободить эту память, но _myPrivate
У него будет участник, который все еще указывает на него!