Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以从“new”返回的解引用值初始化引用吗?_C++_Dynamic Memory Allocation - Fatal编程技术网

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
构成的指针也超出了范围。指针也超出了范围。一如既往地感谢您!有非常翔实和有用的答案!你知道吗,我总是在看书之前尝试任何东西,或者在这里要求它来扩大我的想象力。像往常一样谢谢你!有非常翔实和有用的答案!你知道吗,我总是在看书之前尝试任何东西,或者在这里要求它来扩大我的想象力。