我们可以删除通过引用传递的对象吗?

时间:2016-11-11 07:06:09

标签: c++ c++11 c++14

我的代码如下

 fun(int &a)
 {
    delete &a;
 }

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

我可以删除主功能中分配的内存,并通过引用传递给乐趣和删除内存吗? 这是正确的方式吗?

2 个答案:

答案 0 :(得分:2)

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

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

另外,请注意,从您的代码中您传递的是对数组的第一个(也是唯一的)元素的引用(如果将指针视为数组),但有趣的是不知道数组的大小而不是数组。例如:

 fun(int &a)
 {
    delete &a;
 }

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

它会尝试删除引用的地址。出乎意料的行为。

答案 1 :(得分:2)

不要这样做:

我想这是一个Mikey-mouse示例,但在现实世界中:

  1. 首先,int可能无法创建相关的new - 这是一个很多问题
  2. 谁拥有相关对象。不是功能。合同在哪里?
  3. 请决定谁拥有一个对象。如果"人"通过new创建它应该对delete负责。

    查看智能指针