Уничтожаются ли ссылочные атрибуты при уничтожении класса в C ++? - PullRequest
13 голосов
/ 26 мая 2010

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

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

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

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

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

Ответы [ 7 ]

16 голосов
/ 26 мая 2010

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

8 голосов
/ 26 мая 2010

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

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

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

2 голосов
/ 26 мая 2010

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

1 голос
/ 26 мая 2010

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

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

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

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

0 голосов
/ 26 мая 2010

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

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

0 голосов
/ 26 мая 2010

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

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

0 голосов
/ 26 мая 2010

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

...