4

这个页面上,写着

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

delete p+1; 
delete f(x); 

在这里,delete 的实现没有可以分配零的指针。

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

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

4

4 回答 4

8

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

您曾经delete p+1在程序中编写过代码的可能性非常低,但这无关紧要……

于 2010-04-17T02:28:21.397 回答
5

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 没有意义

于 2010-04-17T02:26:53.897 回答
1

实际上,您可以 delete右值。规范 (n3242) 中的任何内容都没有排除它。在实践中,它没有给出错误

顺便说一句,如果文章说

delete 的操作数不必是左值

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

于 2012-09-29T00:50:45.620 回答
0

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

于 2010-04-17T02:26:41.540 回答