2013-04-02 37 views
-2

参考范围结束时,参考指向指针对象(堆中的对象)时会发生什么?我的意思是在堆中的对象是摧毁或它仍然是:当引用作用域结束时,引用指向指针对象(堆中的对象)时会发生什么?

e.g:

void f(){ 
    Object &obj= *new Object() ; 

    int &i = new int; 
} 

void main(){ 
    f(); 
} 

对象是在破坏F的结束,或者必须调用“删除& N”在结束了吗?原始值相同吗? 如果它必须销毁,那么我如何创建一个常量原始值的副本并将其赋值为引用而不用“新”?

(对不起,语法或正写法,并从原来的问题打字错误)

+2

您似乎将您的引用与您的指针混合在一起。 –

+2

你的代码示例不会编译。 – user763305

回答

1
Object &n = new Object(); 

这不会编译。 A 新表达式new Object()返回一个指向动态分配对象的指针。您无法使用Object*初始化Object&

如果您有T&类型的参考,您应该使用T类型的对象进行初始化。这就是参考的工作原理。 T&是对T对象的引用。

可以做到这一点:

Object &n = *new Object(); 

这将间接引用由新的表达(与*)返回的指针,让你它指向,然后Object初始化与参考Object。不过,我不建议这样做。它只是隐藏了对象被动态分配的事实。

而且,这样做并不影响动态分配对象的生命周期。如果使用新表达式创建一个对象,它具有动态存储持续时间,因此您必须在某个时刻使用delete

0

首先,你需要决定。你想这样的:

Object &n = * new Object(); 

或者你想这样的:

Object* &n = new Object(); 

无论如何,当引用走出去的范围,他们不会导致要删除的对象。 在你的例子中,你将有内存泄漏,没有办法恢复分配在堆中的Objectint

0

首先:你的代码不会编译。

在你最应该(只是编译...)这样做:

Object &n = *(new Object());,但我不推荐这种做法。

关于第二个问题:总是你写“新”,总是你必须在一段时间内删除。

相关问题