Предположим, что у меня есть класс C++ с атрибутом, который является ссылкой:
class ClassB {
ClassA &ref;
public:
ClassB(ClassA &_ref);
}
Конечно, конструктор определяется этот путь:
ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ }
Мой вопрос: То, когда экземпляр класса 'ClassB' уничтожается, является объектом, на который ссылается 'ClassB:: касательно' также уничтоженного?
A ссылка - это не что иное, как псевдоним для переменной, уничтожается псевдоним, а не фактическая переменная. Можно было бы считать это своего рода указателем, но есть причины воздерживаться от подобных (злых) мыслей :).
Нет; ссылки - это просто альтернативный синтаксис для указателей. Значение, на которое они ссылаются, не будет изменено, если ссылка будет освобождена.
Если вы хотите, чтобы он был уничтожен, вам придется инкапсулировать его (обычно это делается с помощью "умных" указателей, таких как std::shared_ptr или std::unique_ptr), которые автоматически освободят память соответствующим образом при уничтожении B. Внутриязыковые ссылки не имеют поведения освобождения памяти, связанного с ними, кроме фактической памяти самой ссылки, в отличие от ссылочной.
Вам придется построить и понять свою собственную модель памяти. Люди обычно используют shared_ptr и подсчет ссылок для базового использования.
Нет. Ссылочные члены не влияют на время жизни того, на что они указывают. Это означает, что у того, что они называют псевдонимом, может быть более длительный или более короткий срок жизни, чем у ссылки.
В вашем случае это не так.
Нет. Вот почему вам нужен деструктор ~ ClassB
, если ClassB отвечает за хранение ref
, чего может не быть.
Когда объект ликвидируется в C++, его память деаллоцируется, а значит, теряется и все, что было в нем заложено (например, переменные-члены).
В случае с указателем, указатель - это переменная-член, которая содержит адрес, поэтому адрес "уничтожается", но объект, на который ссылаются, если таковой имеется, не уничтожается.
В случае члена-ссылки адрес уничтожается, но объект, на который ссылается переменная, не уничтожается.
Класс может определить деструктор, который может определять специальное поведение. Одним из распространенных таких поведений является вызов операций очистки членов (если таковые имеются) и деаллокация памяти, которая была динамически выделена ранее. Здесь, однако, вы уже получили объект, поэтому вы не должны быть тем, кто его деаллоцирует.
У меня нет под рукой спецификации C ++, но я предполагаю «Нет».
Указатели не удаляются автоматически при уничтожении объекта, я не вижу причин, по которым ссылка должна быть другой. Кроме того, автоматическое уничтожение ссылки может привести к интересным ошибкам.