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

Laz*_*zer 4 c++ memory pointers delete-operator

这个页面上,它是写的

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

delete p+1; 
delete f(x); 
Run Code Online (Sandbox Code Playgroud)

这里,delete的实现没有指向它的指针.

在指针中添加一个数字会使它在内存中向前移动那么多个sizeof(*p)单位.

那么,delete p和之间的区别是什么delete p+1,以及为什么0只使指针成为问题delete p+1呢?

Ste*_*sop 8

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

你曾经写过delete p+1一个程序的可能性非常低,但那就是重点......


Mic*_*zek 5

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

A* p = new A();
p++;
delete p-1;
Run Code Online (Sandbox Code Playgroud)

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

*** glibc detected *** free(): invalid pointer: 0x0804b009 ***
Run Code Online (Sandbox Code Playgroud)

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

delete p;
Run Code Online (Sandbox Code Playgroud)

可以翻译成

free(p);
p = 0;
Run Code Online (Sandbox Code Playgroud)

p + 1没有意义