在this page上,写了
一个原因是操作数 删除不必是左值。 考虑:
delete p+1;
delete f(x);
在这里, 执行删除没有 指向零的指针。
在指针中添加一个数字会使那些sizeof(*p)
单位的数量在内存中向前移动。
那么,delete p
和delete p+1
之间有什么区别?为什么指针0
只会成为delete p+1
的问题?
答案 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(或任何其他值)。