当引用范围结束时,当引用指向指针对象(堆中的对象)时会发生什么?我的意思是堆中的对象是破坏还是它仍然存在:
e.g:
void f(){
Object &obj= *new Object() ;
int &i = new int;
}
void main(){
f();
}
对象在f的末尾被破坏或者必须在结尾处调用“delete& n”?原始值相同吗? 如果它必须被销毁那么我如何创建一个常量原始值的副本并且被赋予一个引用而不用“new”来创建它?
(对不起语法或ortography,以及原始问题的输入错误)
答案 0 :(得分:1)
Object &n = new Object();
这不会编译。像new Object()
这样的 new-expression 返回一个指向动态分配对象的指针。您无法使用Object&
初始化Object*
。
如果您的类型为T&
,则应使用T
类型的对象对其进行初始化。这就是参考的工作原理。 T&
是对T
对象的引用。
你可以这样做:
Object &n = *new Object();
这将取消引用 new-expression (使用*
)返回的指针,以获取它指向的Object
,然后使用{{{{1}初始化引用1}}。但是,我不建议这样做。它只是隐藏了对象是动态分配的事实。
不,这样做不会影响动态分配对象的生命周期。如果使用 new-expression 创建对象,则它具有动态存储持续时间,因此您必须在某个时刻Object
。
答案 1 :(得分:0)
首先,你需要决定。你想要这个:
Object &n = * new Object();
或者你想要这个:
Object* &n = new Object();
无论如何,当引用超出范围时,它们不会导致删除该对象。
在您的示例中,您将发生内存泄漏,无法恢复堆中Object
和int
。
答案 2 :(得分:0)
首先:您的代码无法编译。
最多你应该做的(仅用于编译......):
Object &n = *(new Object());
但我不推荐这种做法。
关于第二个问题:总是你写“新”,总是你必须在一段时间内删除。