给出一个对象,例如listNode。
如果我使用以下方法初始化指向对象的指针:
listNode* head_node;
这与
有什么不同listNode* head_node = NULL;
答案 0 :(得分:1)
在第一种情况下,listNode* head_node;
编译器将分配一些内存来保存指针。该内存可以包含任何值(例如,从该位置用于其他用途时可以是某个随机值),实际上,读取它会导致未定义的行为。
在第二种情况下,listNode* head_node = NULL;
,编译器将分配一些内存来保存指针,然后将NULL
写入该位置,以确保指针为NULL
。
要注意的一件事,您应该使用nullptr
而不是NULL
。有关原因,请参见this answer。
答案 1 :(得分:0)
在第一种情况下,您要声明一个指针变量。在第二种情况下,您要声明一个指针变量并将其初始化为NULL
。当您尝试访问该变量时,任何已声明但未初始化的变量都会导致未定义的行为。这和指针没有什么关系,指针和其他变量一样。例如,如果您写了int a;
,然后又cout << a;
,您将看到a
最有可能写入了一个随机整数值。但是,如果先编写int a = 0;
,然后再编写cout << a;
,您将看到a
在任何计算机上的任何编译器上始终为0。这是定义明确的行为,与未定义的行为相反。
在您的情况下,我不鼓励使用原始指针,因为您很可能希望始终将它们初始化为nullptr
,而且您的listNode最有可能被列表本身“拥有”。尝试改用std::unique_ptr<listNode>
:默认情况下,它将同时初始化您指向nullptr
的指针,并在指针超出范围时释放分配的内存,这意味着如果列表头将被删除,则所有列表中的其他节点也会自动删除。