假设我有一个带有引用属性的 C++ 类:
class ClassB {
ClassA &ref;
public:
ClassB(ClassA &_ref);
}
当然,构造函数是这样定义的:
ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ }
我的问题是:当“ClassB”类的实例被销毁时,“ClassB::ref”引用的对象是否也被销毁?
假设我有一个带有引用属性的 C++ 类:
class ClassB {
ClassA &ref;
public:
ClassB(ClassA &_ref);
}
当然,构造函数是这样定义的:
ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ }
我的问题是:当“ClassB”类的实例被销毁时,“ClassB::ref”引用的对象是否也被销毁?
引用只不过是变量的别名,别名被破坏,而不是实际变量。您可以将其视为某种指针,但有理由避免这种(邪恶)想法:)。
不会。引用成员不会影响他们指向的任何内容的生命周期。这意味着他们别名的东西可能比参考的生命周期更长或更短。
另一方面,如果 const 引用指向临时对象,则它们会影响它们指向的对象的生命周期。
在你的情况下,它没有。
~ClassB
不,如果 ClassB 负责存储ref
它可能不负责的存储,这就是为什么你需要一个析构函数。
当一个对象在 C++ 中被删除时,它的内存被释放,因此嵌入其中的所有内容(例如成员变量)也会丢失。
在指针的情况下,指针是一个包含地址的成员变量,因此地址被“销毁”,但引用的对象(如果有的话)不是。
在引用成员的情况下,地址被破坏,但目标不受影响。
一个类可以定义一个可以定义特殊行为的析构函数。一种常见的此类行为是对成员(如果有)调用清理操作,并释放之前动态分配的内存。但是,在这里,您已经获得了一个对象,因此您不应该是解除分配它的人。
不; 引用只是指针的另一种语法。如果引用被解除分配,它们引用的值不会被修改。
如果您希望它被销毁,则必须封装它(通常通过“智能”指针完成,例如 std::shared_ptr 或 std::unique_ptr),这将在销毁 B 时以适当的方式自动释放内存。语言内引用没有与之相关的内存释放行为,除了引用本身的实际内存,而不是被引用。
你必须建立和理解你自己的记忆模型。人们通常将 shared_ptr 和引用计数用于基本用途。
我手头没有 C++ 规范,但我的猜测是“否”。
当对象被销毁时,指针不会自动删除,我看不出引用应该不同的理由。另外,自动销毁引用对于有趣的错误来说已经成熟了。