为什么我可以“删除p;”,但不能“删除(p + 1);”?为什么删除需要左值?

时间:2010-04-17 02:21:55

标签: c++ pointers memory delete-operator

this page上,写了

  

一个原因是操作数   删除不必是左值。   考虑:

delete p+1; 
delete f(x); 
  

在这里,   执行删除没有   指向零的指针。

在指针中添加一个数字会使那些sizeof(*p)单位的数量在内存中向前移动。

那么,delete pdelete p+1之间有什么区别?为什么指针0只会成为delete p+1的问题?

4 个答案:

答案 0 :(得分:8)

你不能p + 1 = 0。出于同样的原因,如果你做delete p + 1,那么删除不能将其操作数(p + 1)清零,这就是关于Stroustrup常见问题解答的问题。

您在程序中编写delete p+1的可能性非常低,但这不是重点......

答案 1 :(得分:5)

p和p + 1指向不同的地方,因为你正确地说sizeof(*p)单位。您无法删除尚未分配的内容,例如:

A* p = new A();
p++;
delete p-1;

会删除原始分配。当未分配p + 1时删除p + 1是未定义的; glib转出:

*** glibc detected *** free(): invalid pointer: 0x0804b009 ***

实现不能为零p + 1,因为p + 1不是要修改的变量。这段话说的是

delete p;

可以翻译为

free(p);
p = 0;

p + 1

没有意义

答案 2 :(得分:1)

实际上,你可以 delete一个右值。规范中没有任何内容(n3242)确实排除了它。在实践中,它gives no error

BTW如果文章说

  

删除的操作数不必是左值

这意味着它可能是,也可能不是左值。它并没有说操作数不能是左值。

答案 3 :(得分:0)

原因是这两个都不是左值,因此根本不可能将它们设置为NULL(或任何其他值)。