-2

当引用范围结束时,当引用指向对象的指针(堆中的对象)时会发生什么?我的意思是堆中的对象是销毁还是保留:

例如:

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

   int &i = new int;
}

void main(){
  f();
}

对象在 f 的末尾被销毁还是必须在末尾调用“delete &n”?原始值也一样?如果它必须被破坏,那么我如何创建一个常量原始值的副本并分配给一个引用而不用“新”创建它?

(对不起语法或拼字法,以及原始问题的打字错误)

4

3 回答 3

1
Object &n = new Object();

这不会编译。new-expression like返回一个new Object()指向动态分配对象的指针。你不能Object&Object*.

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

可以这样做:

Object &n = *new Object();

这将取消引用new-expression (with )返回的指针*以获取Objectit 指向的位置,然后用 that 初始化引用Object。但是,我完全不建议这样做。它只是隐藏了对象是动态分配的事实。

不,这样做不会影响动态分配对象的生命周期。如果您使用new-expression创建一个对象,它具有动态存储持续时间,因此您必须delete在某个时候使用它。

于 2013-04-02T09:25:05.840 回答
0

首先,你需要做出决定。你要这个:

Object &n = * new Object();

或者你想要这个:

Object* &n = new Object();

无论如何,当引用超出范围时,它们不会导致对象被删除。在您的示例中,您将有内存泄漏,无法恢复堆中的Object和分配的。int

于 2013-04-02T09:24:51.780 回答
0

首先:您的代码将无法编译。

最多你应该做(只是为了编译......):

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

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

于 2013-04-02T09:29:35.690 回答