【发布时间】:2015-12-12 20:16:13
【问题描述】:
在寻找关于我应该使用零还是空的答案时,我在another question 上从用户 stroustup 的 SO 中找到了这个:
我应该使用 NULL 还是 0?在C++中,NULL的定义是0,所以有 只是审美差异。我更喜欢避免使用宏,所以我使用 0。 NULL 的另一个问题是人们有时会错误地认为 它不同于 0 和/或不是整数。在预标准 代码,NULL 有时被定义为不合适的东西,并且 因此必须/必须避免。现在这种情况不太常见了。
所以 NULL 和 0 是一样的,这很酷。但我在这里需要更多的了解:假设我有以下内容(来自cprogramming.com 的随机示例):
struct node {
int x;
node *next;
};
int main()
{
node *root; // This won't change, or we would lose the list in memory
node *conductor; // This will point to each node as it traverses the list
root = new node; // Sets it to actually point to something
root->next = 0; // Otherwise it would not work well
root->x = 12;
conductor = root; // The conductor points to the first node
if ( conductor != 0 ) {
while ( conductor->next != 0)
conductor = conductor->next;
}
conductor->next = new node; // Creates a node at the end of the list
conductor = conductor->next; // Points to that node
conductor->next = 0; // Prevents it from going any further
conductor->x = 42;
}
以while ( conductor->next != 0) 行为例;据我了解,内存中的那个位置可能包含以前使用的垃圾值。当它被程序从使用中释放时,它再次变得可用。那么如何使用整数零作为比较的值,以检查您是否已到达链表的末尾?你能保证垃圾价值为零吗?为什么不...只是一个随机的垃圾值?
那么,我的理解完全不正确,还是在前一个程序释放该内存块的过程中,该内存是否重新归零?过去我一直使用 NULL,认为它是一个神奇的关键字,可以知道它是在查看零值还是垃圾值。但是,阅读上面对其他人问题的答案,我发现这是不正确的。对于这样一个微不足道的问题,我深表歉意,但每次我在我的应用程序中与 NULL 或零进行比较以检查是否存在某些东西时,这让我感到困扰,它只是有效,我不知道为什么。感谢您提供的任何启发。
【问题讨论】:
-
在您的示例中,假设当对象被释放时,相应的指针立即被开发人员设置为 NULL 或 0。如果没有完成,那么您是正确的,直到程序终止,该特定位置将包含垃圾值,并且在大多数情况下,这些是堆损坏的来源。
-
编译器会将0转换为NULL,就像C++中的
true和false可以与1和0互换一样 -
在 C++ 中,NULL 的定义是 0……嗯,
nullptr就到这里了。 -
Bjarne Stroustrup 指出,在正确编写的 C++ 程序中不需要 NULL。 @ShreyanShet 那不正确。它被视为指示空指针的特殊值,但内部没有将其转换为 NULL 之类的东西。确实,NULL 只是零的一个宏,所以说相反的转换会更准确。