Предположим, что у меня есть класс
class Foo
{
public:
~Foo() { delete &_bar; }
void SetBar(const Bar& bar)
{
_bar = bar;
}
const Bar& GetBar() { return _bar; }
private:
Bar& _bar;
}
И мое использование этого класса следующим образом (предположите, что Панель имеет рабочего конструктора копии),
Foo f;
f.SetBar(*(new Bar));
const Bar* bar = &(f.GetBar());
f.SetBar(*(new Bar(bar)));
delete bar;
У меня есть ситуация, подобная этому (в коде, который я не написал), и когда я отлаживаю в наборе точки останова на, "удаляют панель"; строка, я вижу это
&f._bar == bar
Мой вопрос - это: Почему делают &f. _ панель и панель указывают на тот же блок памяти, и если я не учитываю, "удаляют панель"; каковы последствия с точки зрения управления памятью?
Большое спасибо!
Ссылки Быть «переправлено», SetBar ()
просто копирует содержимое панели
на объект, на который ссылается _bar
.
Если вам нужна такая функциональность, используйте указатели. Также ваш пример использования будет намного проще, если бы вы просто используете указатели.
Код, который вы разместили, не скомпилируются, потому что ссылки не могут быть построены по умолчанию. Кроме того, вы, кажется, думаете, что вы переправляете ссылку, которую вы не (см. здесь ). Вместо этого вы просто копируете объекты над любым ссылкой на то, что является ссылкой, поэтому значение:
&(f.GetBar())
никогда не меняется. Вы не должны удалять _bar, потому что вы никогда не владели этим (или даже действительно знали, что это динамически выделено), чтобы начать с. Это должно быть ответственностью того, кто «вновь» это.