好吧,这可能看起来很荒谬,但我经常看到使用引用删除动态分配的内存的代码如下所示:
Obj* ptr = &someObj;
delete ptr;
而不是看似合乎逻辑的选择:
delete &someObj;
这背后有什么特别的安全理由,还是仅仅是风格的东西?
答案 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”释放一块内存,语法为:
delete cast-expression
delete[] cast-expression
根据C ++规定,cast-expression参数必须是指向先前为对象分配的内存块的指针。
所以delete ptr
不是风格,也不是安全。