初始化指向对象的指针

时间:2019-01-30 18:55:38

标签: c++ pointers

给出一个对象,例如listNode。

如果我使用以下方法初始化指向对象的指针:

listNode* head_node;

这与

有什么不同
listNode* head_node = NULL;

2 个答案:

答案 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的指针,并在指针超出范围时释放分配的内存,这意味着如果列表头将被删除,则所有列表中的其他节点也会自动删除。