初始化指向对象的指针

Initialize a pointer to an object

本文关键字:指针 对象 初始化      更新时间:2023-10-16

给定一个对象,例如listNode。

如果我用初始化指向对象的指针

listNode* head_node;

这和有什么不同

listNode* head_node = NULL;

在第一种情况listNode* head_node;中,编译器将分配一些内存来保存指针。该内存可以包含任何值(例如,它可能是该位置用于其他位置时的某个随机值),事实上,读取它将导致未定义的行为。

在第二种情况listNode* head_node = NULL;中,编译器将分配一些内存来保存指针,然后将NULL写入该位置,从而保证指针为NULL

需要注意的一点是,应该使用nullptr,而不是NULL。请参阅此答案了解原因。

在第一种情况下,您要声明一个指针变量。在第二种情况下,您将声明一个指针变量并将其初始化为NULL。当您尝试访问变量时,任何已声明但未初始化的变量都会导致未定义的行为。这与指针无关,指针和其他变量一样。例如,如果你先写int a;,然后再写cout << a;,你会发现a很可能写了一个随机整数值。但如果你写int a = 0;,然后又写cout << a;,你会看到a在任何机器上的任何编译器上总是0。这是定义良好的行为,而不是未定义的行为。

我不建议在您的情况下使用原始指针,因为您很可能希望始终将它们初始化为nullptr,而且您的listNode很可能由列表本身"拥有"。尝试使用std::unique_ptr<listNode>:默认情况下,它会初始化指向nullptr的指针,并在指针超出范围时释放分配的内存,这意味着如果删除列表的头部,列表中的所有其他节点也会自动删除。