可以删除作为引用传递的对象吗?

Can we delete an object passed as by reference?

本文关键字:对象 引用 删除      更新时间:2023-10-16

代码如下

 fun(int &a)
 {
    delete &a;
 }
 main()
 {
     int *a = new int(10);
     fun(*a);
 }

可以在fun中删除在main函数中分配并作为引用传递的内存和在fun中删除内存吗?这条路对吗?

不要这样做:

我猜这是一个米老鼠的例子,但在现实世界中:

  1. 首先,int可能不是由new创建的-这里有很多问题
  2. 谁拥有正在讨论的对象。不是函数。合同在哪里?

请决定谁拥有一个对象。此外,如果"人"通过new创建它,则应对delete负责。

查看智能指针

简短的回答:是的,你可以。不要这样做。

引用是不可变的,也就是说,地址(如果编译器将引用实现为指针)是不可变的const。因此,如果您删除它,原始引用将指向未分配的内存,并将崩溃。

还要注意的是,从你的代码中,你传递了对数组的第一个(也是唯一的)元素的引用(如果有人认为指针是数组),但是fun不知道数组的大小,也不知道它是数组。例如:

 fun(int &a)
 {
    delete &a;
 }
 main()
 {
     int a = 42;
     fun(a);
 }

它将尝试删除引用的地址。意想不到的行为。