C++ 我可以从“new”返回的解引用值初始化引用吗?
正如我所看到的,C++ 我可以从“new”返回的解引用值初始化引用吗?,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,正如我所看到的,new在空闲存储中分配一个未命名的对象,并返回指向该未命名对象的指针 因此,我们可以创建对该对象的引用: int* pi = new int(100); int& ri = *pi; 我感兴趣的是,我可以在自由存储上创建一个对象,而无需将new的返回指定给指针,而是通过将new的取消引用值指定给引用,将其指定给未命名对象的引用: int& x = *(new int(7)); cout << x << endl; // 7 x += 3
new
在空闲存储中分配一个未命名的对象,并返回指向该未命名对象的指针
因此,我们可以创建对该对象的引用:
int* pi = new int(100);
int& ri = *pi;
我感兴趣的是,我可以在自由存储上创建一个对象,而无需将new
的返回指定给指针,而是通过将new
的取消引用值指定给引用,将其指定给未命名对象的引用:
int& x = *(new int(7));
cout << x << endl; // 7
x += 34;
cout << x << endl; // 41
int&x=*(新的int(7));
是的,你可以。但我认为这是个坏主意。一旦此引用超出范围,您就无法释放动态内存(或者您只是忘记,它是伪装的动态内存),这很可能会导致内存泄漏。是的,您可以。但我认为这是个坏主意。一旦该引用超出范围,您就无法释放动态内存(或者您只是忘记,它是伪装的动态内存),这很可能会导致内存泄漏
我想知道我是否能做到这一点,或者这是一个坏主意
你可以这样做,但你真的不应该。原因是,由于您不再使用指针,因此很难记住释放收到的内存。这会让你摆脱指针的思维模式,更容易忘记在所有退出路径上调用delete
当你解除分配时,它看起来也会很奇怪,因为你需要做一些类似的事情
delete &x;
我想知道我是否能做到这一点,或者这是一个坏主意
你可以这样做,但你真的不应该。原因是,由于您不再使用指针,因此很难记住释放收到的内存。这会让你摆脱指针的思维模式,更容易忘记在所有退出路径上调用delete
当你解除分配时,它看起来也会很奇怪,因为你需要做一些类似的事情
delete &x;
对但是现在你需要问的是delete&ri代码>有效?如何删除该内存<代码>删除&x代码>,它更容易出错,可读性也更低,而且在数千行之后,您会被卡住。@RichardCriten确实如此delete
需要一个指向由以前的新表达式创建的非数组对象的指针,&ri
提供给您。@RichardCriten不需要这样做。它需要指向由以前的新表达式创建的非数组对象的指针。我相信我们都同意,如果ri
指的是新表达式返回的对象,那么&ri
就是指向新表达式返回的对象的指针。@RichardCritten和yes,因为ri
是由*pi
yes构成的。但是现在你需要问的是delete&ri代码>有效?如何删除该内存<代码>删除&x代码>,它更容易出错,可读性也更低,而且在数千行之后,您会被卡住。@RichardCriten确实如此delete
需要一个指向由以前的新表达式创建的非数组对象的指针,&ri
提供给您。@RichardCriten不需要这样做。它需要指向由以前的新表达式创建的非数组对象的指针。我相信我们都同意,如果ri
引用新表达式返回的对象,那么&ri
就是指向新表达式返回的对象的指针。@RichardCritten和yes,必须这样做,因为ri
是由*pi
构成的指针也超出了范围。指针也超出了范围。一如既往地感谢您!有非常翔实和有用的答案!你知道吗,我总是在看书之前尝试任何东西,或者在这里要求它来扩大我的想象力。像往常一样谢谢你!有非常翔实和有用的答案!你知道吗,我总是在看书之前尝试任何东西,或者在这里要求它来扩大我的想象力。