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

sus*_*ary 6 c++ c++11 c++14

我的代码如下

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

 main()
 {
     int *a = new int(10);
     fun(*a);
 }
Run Code Online (Sandbox Code Playgroud)

我可以在fun中删除在主函数中分配并通过引用传递的内存,并在fun中删除内存吗?这是正确的方法吗?

LeD*_*YoM 2

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

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

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

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

 main()
 {
     int a = 42;
     fun(a);
 }
Run Code Online (Sandbox Code Playgroud)

它将尝试删除引用的地址。意外的行为。

  • “另外,请注意,从您的代码中您正在传递对数组第一个元素的引用”——不,OP 没有这样做。除此之外,这个答案是一句话不明答案,两段评论。评论还不错(如果编辑正确的话),但您可能也想解释一下您的答案。 (4认同)