为什么似乎没有人写过`delete& someObj`?

时间:2017-02-09 10:11:34

标签: c++

好吧,这可能看起来很荒谬,但我经常看到使用引用删除动态分配的内存的代码如下所示:

Obj* ptr = &someObj;
delete ptr;

而不是看似合乎逻辑的选择:

delete &someObj;

这背后有什么特别的安全理由,还是仅仅是风格的东西?

3 个答案:

答案 0 :(得分:3)

没有额外的安全性。这是编写引用代码的人的风格选择。

PS。通过引用删除动态分配的内存是非常罕见的(或者应该)。将动态对象的地址存储在指针中是一种非常常见的约定。这些天根本不可能手动删除任何内存,因为该任务通常被委托给智能指针。

答案 1 :(得分:2)

好的,如果动态分配内存,则会收到指针,而不是值本身。

int* a = new int;

然后你必须调用delete并传递指针:

delete a;

如果您尝试分配到int b = *a;之类的变量,则b 会动态分配。因此,您无法编写delete &b;,因为b已在堆栈上分配,并且在超出范围时将自动清除。如果您将其分配给int& c = *a;这样的引用,那么您就可以编写delete &c;但这是一个错误的错误风格,因为您不能保证引用的内存由c动态分配。

答案 2 :(得分:-1)

运算符“delete”释放一块内存,语法为:

  1. delete cast-expression
  2. delete[] cast-expression
  3. 根据C ++规定,cast-expression参数必须是指向先前为对象分配的内存块的指针。 所以delete ptr不是风格,也不是安全。