假设我有一个C ++类,其属性是一个引用:
class ClassB {
ClassA &ref;
public:
ClassB(ClassA &_ref);
}
当然,构造函数是这样定义的:
ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ }
我的问题是:当类'ClassB'的实例被销毁时,'ClassB :: ref'引用的对象是否也被销毁?
答案 0 :(得分:16)
引用只是变量的别名,别名被破坏,而不是实际变量。你可以认为它是某种指针,但有理由避免这种(邪恶的)思想:)。
答案 1 :(得分:8)
没有。参考成员不会影响他们指向的生命周期。这意味着他们的别名可能比参考的更长或更短的生命周期。
在你的情况下它没有。
答案 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 ++规范,但我的猜测是“不”。
当对象被销毁时,指针不会被自动删除,我认为没有理由说引用应该是不同的。另外,自动销毁参考文件对于有趣的错误来说已经成熟。