在C ++中销毁类时是否销毁了引用属性?

时间:2010-05-25 20:28:19

标签: c++ class reference attributes destroy

假设我有一个C ++类,其属性是一个引用:

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

当然,构造函数是这样定义的:

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

我的问题是:当类'ClassB'的实例被销毁时,'ClassB :: ref'引用的对象是否也被销毁?

7 个答案:

答案 0 :(得分:16)

引用只是变量的别名,别名被破坏,而不是实际变量。你可以认为它是某种指针,但有理由避免这种(邪恶的)思想:)。

答案 1 :(得分:8)

没有。参考成员不会影响他们指向的生命周期。这意味着他们的别名可能比参考的更长或更短的生命周期。

On the other hand, const references can affect the lifetime of what they point to if they point to a temporary.

在你的情况下它没有。

答案 2 :(得分:2)

没有。这就是为什么你需要一个~ClassB析构函数,如果ClassB负责存储它可能不是ref。{/ p>

答案 3 :(得分:1)

当在C ++中删除某个对象时,其内存将被释放,因此嵌入其中的所有内容(例如成员变量)也会丢失。

对于指针,指针是包含地址的成员变量,因此地址被“销毁”,但引用的对象(如果有的话)不是。

对于引用成员,地址被销毁,但目标不受影响。

一个类可以定义一个可以定义特殊行为的析构函数。一种常见的此类行为是对成员(如果有)调用清理操作,并释放先前动态分配的内存。但是,在这里,你已经有了一个对象,所以你不应该将它解除分配。

答案 4 :(得分:0)

没有;引用只是指针的替代语法。如果引用被释放,则不会修改它们引用的值。

答案 5 :(得分:0)

如果你想要它被销毁,你将不得不封装它(通常通过“智能”指针完成,如std :: shared_ptr或std :: unique_ptr),它将在破坏时以适当的方式自动释放内存B.语言引用没有与它们相关的内存释放行为,除了引用本身的实际内存,而不是引用。

您必须构建并了解自己的内存模型。人们通常使用shared_ptr和引用计数进行基本用途。

答案 6 :(得分:-1)

我手边没有C ++规范,但我的猜测是“不”。

当对象被销毁时,指针不会被自动删除,我认为没有理由说引用应该是不同的。另外,自动销毁参考文件对于有趣的错误来说已经成熟。