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