Удаленные ли эталонные атрибуты, когда класс разрушен в C ++?

StackOverflow https://stackoverflow.com/questions/2908275

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

В случае ссылочного участника адрес разрушен, но цель не затронута.

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

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

Если вы хотите, чтобы это было уничтожено, вам придется капсулировать его (обычно делается через «Smart» указателей, таких как STD :: Shared_PTR или STD :: Unique_ptr), который автоматически отпустит память в соответствующей моде на разрушение B. На языках языковых ссылок нет поведения освобождения памяти, связанные с ними, за исключением фактической памяти самой ссылки, в отличие от упомянутой.

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

У меня нет спецификации C ++, но я думаю, это «нет».

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top