18

假设我有一个带有引用属性的 C++ 类:

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

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

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

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

4

7 回答 7

18

引用只不过是变量的别名,别名被破坏,而不是实际变量。您可以将其视为某种指针,但有理由避免这种(邪恶)想法:)。

于 2010-05-25T20:33:59.673 回答
11

不会。引用成员不会影响他们指向的任何内容的生命周期。这意味着他们别名的东西可能比参考的生命周期更长或更短。

另一方面,如果 const 引用指向临时对象,则它们会影响它们指向的对象的生命周期。

在你的情况下,它没有。

于 2010-05-25T20:52:25.497 回答
2

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

于 2010-05-25T20:31:10.727 回答
1

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

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

在引用成员的情况下,地址被破坏,但目标不受影响。

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

于 2010-05-25T20:54:54.230 回答
0

不; 引用只是指针的另一种语法。如果引用被解除分配,它们引用的值不会被修改。

于 2010-05-25T20:30:42.073 回答
0

如果您希望它被销毁,则必须封装它(通常通过“智能”指针完成,例如 std::shared_ptr 或 std::unique_ptr),这将在销毁 B 时以适当的方式自动释放内存。语言内引用没有与之相关的内存释放行为,除了引用本身的实际内存,而不是被引用。

你必须建立和理解你自己的记忆模型。人们通常将 shared_ptr 和引用计数用于基本用途。

于 2010-05-25T20:43:26.707 回答
-1

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

当对象被销毁时,指针不会自动删除,我看不出引用应该不同的理由。另外,自动销毁引用对于有趣的错误来说已经成熟了。

于 2010-05-25T20:31:36.297 回答