当引用指向指针(堆中的对象)的对象时,引用作用域结束

What happens when a reference point to an object of a pointer (object in the heap) when the reference scope end?

本文关键字:对象 引用 作用域 结束 指针      更新时间:2023-10-16

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

例句:

void f(){
    Object &obj= *new Object() ;
   int &i = new int;
}
void main(){
  f();
}

对象在f的末尾被销毁,必须在末尾调用"delete &n"。原始值也一样吗?如果它必须销毁,那么我如何创建一个常量原始值的副本并将其赋值给引用而不使用"new"?

(语法或拼写错误,以及原始问题的输入错误)

Object &n = new Object();

这将无法编译。像new Object()这样的new-expression返回一个指向动态分配对象的指针。不能用Object*初始化Object&

如果你有一个T&类型的引用,你应该用T类型的对象初始化它。这就是参考的工作原理。T&是对T对象的引用。

可以这样做:

Object &n = *new Object();

这将解引用new-expression返回的指针(使用*),以获得它指向的Object,然后用该Object初始化引用。但是,我不建议这样做。它只是隐藏了对象是动态分配的事实。

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

首先,您需要决定。你想要这个:

Object &n = * new Object();

或者你想要这个:

Object* &n = new Object();
无论如何,当引用超出作用域时,它们不会导致对象被删除。在您的示例中,您将出现内存泄漏,无法恢复堆中分配的Objectint

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

你最多应该这样做(只是为了编译…):

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

关于第二个问题:总是你写"new",总是你必须在某个时间删除。