Подтвердить что ты не робот

Являются ли ссылочные атрибуты уничтожены, когда класс уничтожен на С++?

Предположим, что у меня есть класс С++ с атрибутом, который является ссылкой:

class ClassB {
    ClassA &ref;
public:
    ClassB(ClassA &_ref);
}

Конечно, конструктор определяется следующим образом:

ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ }

Мой вопрос: когда уничтожается экземпляр класса ClassB, является ли объект, на который ссылается "ClassB:: ref", также уничтожен?

4b9b3361

Ответ 1

Ссылка - не что иное, как псевдоним для переменной, алиас разрушается, а не действительная переменная. Вы можете считать это своего рода указателем, но есть причины воздержаться от таких (злобных) мыслей:).

Ответ 2

Нет. Ссылки члены не влияют на время жизни, на что они указывают. Это означает, что у них есть псевдоним, который может иметь более длительный или более короткий срок службы, чем ссылка.

С другой стороны, ссылки const могут влиять на время жизни того, на что они указывают, если они указывают на временный.

В вашем случае это не так.

Ответ 3

Нет. Вот почему вам нужен деструктор ~ClassB, если ClassB отвечает за хранение ref, которого он может не быть.

Ответ 4

Когда объект удаляется на С++, его память освобождается и, следовательно, все, что было встроено в нее (например, переменные-члены), также теряется.

В случае указателя указатель является переменной-членом, которая содержит адрес, поэтому адрес "уничтожен", но ссылочный объект, если он есть, не является.

В случае ссылочного элемента адрес уничтожается, но цель не затрагивается.

Класс может определять деструктор, который может определять особые поведения. Одним из распространенных подобных действий является вызывать операции очистки членов (если они есть) и освобождать память, динамически распределяемую ранее. Здесь, однако, у вас уже есть объект, поэтому вы не должны его освобождать.

Ответ 5

Нет; ссылки - просто альтернативный синтаксис указателей. Значение, которое они ссылаются, не будет изменено, если ссылка освобождена.

Ответ 6

Если вы хотите, чтобы он был уничтожен, вам придется его инкапсулировать (обычно это делается с помощью "умных" указателей, таких как std:: shared_ptr или std:: unique_ptr), которые автоматически отменяют память при уничтожении B. Ссылки на языке не имеют никакого отношения к освобождению памяти, связанного с ними, за исключением фактической памяти самой ссылки, в отличие от упомянутого.

Вам нужно будет построить и понять свою собственную модель памяти. Обычно люди используют shared_ptr и подсчет ссылок для базового использования.

Ответ 7

У меня нет спецификации С++, но я думаю, что это "Нет".

Указатели не удаляются автоматически при уничтожении объекта, я не вижу причин, по которым ссылка должна отличаться. Плюс, если ссылка будет автоматически уничтожена, созрела бы для интересных ошибок.