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

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

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

Конечно, конструктор определяется этот путь:

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

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

16
задан Genba 25 May 2010 в 20:28
поделиться

7 ответов

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

17
ответ дан 30 November 2019 в 21:10
поделиться

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

0
ответ дан 30 November 2019 в 21:10
поделиться

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

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

0
ответ дан 30 November 2019 в 21:10
поделиться

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

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

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

9
ответ дан 30 November 2019 в 21:10
поделиться

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

2
ответ дан 30 November 2019 в 21:10
поделиться

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

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

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

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

1
ответ дан 30 November 2019 в 21:10
поделиться

У меня нет под рукой спецификации C ++, но я предполагаю «Нет».

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

-1
ответ дан 30 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: