假设我们有以下(奇异)代码:
int* getPointer(int* p) {
int* x_p = nullptr;
int& x = *p;
if(x==7) {
x_p = &x;
}
return x_p;
}
由于为x
分配了p
的值,我觉得此代码不安全:当x
超出范围时,它的相关对象可能会被破坏,将x_p
置于无效状态。
但是,我测试了这段代码,它运行正常。我是幸运还是x
是参考变量改变销毁序列的事实?
答案 0 :(得分:5)
不,*p
显然不会被x
超出范围而被破坏,否则引用本身会导致双重 - "释放"几乎每次你使用它们。
答案 1 :(得分:3)
创建或分配引用不会创建新对象,因此无需销毁任何内容。因此,当引用超出范围时,不会调用析构函数。更明确地说明:当引用超出范围时,不会调用析构函数。
答案 2 :(得分:1)
引用不会被破坏,对象也是如此。 对象的生命周期,即*p
,与函数范围无关。
答案 3 :(得分:0)
销毁原始指针或引用不会破坏它指向的对象。
情况实际上是相反 - 在您的示例中,您手动分配一些内存,将其地址保存在原始指针中,并允许销毁指针,除非您有副本它所指向的地址你无法释放内存并且你有内存泄漏。
如果你想要一个破坏它指向的对象的指针,当它被销毁时,使用std::unique_ptr
。