在这个页面上,写着
一个原因是 delete 的操作数不必是左值。考虑:
delete p+1;
delete f(x);
在这里,delete 的实现没有可以分配零的指针。
向指针添加一个数字会将其在内存中向前移动这些数量的sizeof(*p)
单位。
那么, 和 之间有什么区别delete p
,delete p+1
为什么0
只使指针成为问题delete p+1
?
在这个页面上,写着
一个原因是 delete 的操作数不必是左值。考虑:
delete p+1;
delete f(x);
在这里,delete 的实现没有可以分配零的指针。
向指针添加一个数字会将其在内存中向前移动这些数量的sizeof(*p)
单位。
那么, 和 之间有什么区别delete p
,delete p+1
为什么0
只使指针成为问题delete p+1
?
你不能这样做p + 1 = 0
。出于同样的原因,如果你这样做了,delete p + 1
那么 delete 不能将其操作数 (p+1) 清零,这就是 Stroustrup 的常见问题解答中的问题所在。
您曾经delete p+1
在程序中编写过代码的可能性非常低,但这无关紧要……
p 和 p+1 指向不同的地方,正如你所说的sizeof(*p)
单位分开。您不能删除尚未分配的内容,但例如:
A* p = new A();
p++;
delete p-1;
会删除原来的分配。当最初没有分配 p+1 时删除 p+1 是未定义的;油嘴滑舌的结果是:
*** glibc detected *** free(): invalid pointer: 0x0804b009 ***
实现不能将 p+1 归零,因为 p+1 不是要修改的变量。那段话是这样说的
delete p;
可以翻译成
free(p);
p = 0;
这对 p+1 没有意义
实际上,您可以 delete
右值。规范 (n3242) 中的任何内容都没有排除它。在实践中,它没有给出错误。
顺便说一句,如果文章说
delete 的操作数不必是左值
这意味着它可能是左值,也可能不是左值。它并没有说操作数不能是左值。
原因是它们都不是左值,因此根本不可能将它们设置为 NULL(或任何其他值)。