3

删除之前是否需要将类中的所有指针都分配给NULL?我的意思是,例如,对于删除二叉搜索树中的节点的函数的以下片段,

1.

Node *temp = parent->left;
parent->left = temp->left;
delete temp;

2.

Node *temp = parent->left;
parent->left = temp->left;
temp->left = NULL;
delete temp;

是线

temp->left = NULL;

必要的?有些教程会这样做,而其他教程则不会。

4

5 回答 5

4

要看。如果析构函数Node删除了子节点,则有必要。如果没有,则不需要该行。然而,有些教程可能只是为了推广良好的编程风格而包含它。如果您在程序中引入错误并在删除它后使用指针,那么使用空指针会给您一个错误消息而不是未定义的行为。temp = NULL;如果您想更严格地遵循这种风格,您可能还想添加该行。

于 2013-06-17T12:21:57.687 回答
4

应该没必要吧。temp删除后没有代码可以安全地取消引用。然而,正如 Ralph Tandetzky 所指出的,如果Node有一个对其left成员进行操作的析构函数,则它是有效的

ing 其成员的另一个可能的好处NULL是更可预测地捕获无效访问。

于 2013-06-17T12:21:16.833 回答
1

没有线

温度->左=空;

没有必要。在许多情况下,如果您强制自己在每次删除后添加此行会很有帮助,因为如果您的程序崩溃并且您看到指针设置为零,您将能够轻松识别错误。

于 2013-06-17T12:22:53.440 回答
1

不,这不是必需的,但是如果left指针指向的内存归对象所有,则应依次将其删除。

于 2013-06-17T12:21:06.710 回答
1

这不是绝对必要的,这是一种旨在帮助调试的措施。想象一下,您离开了没有 a 的指针NULL(例如,在链表中),并且不知何故您进入了已释放但其内容尚未删除的内存。然后存在您可以跟随该指针的危险,而实际上并不知道它是否仍然存在,并且可能在它已经被删除时试图删除该内存。

因此,这只是安全性,而不是旨在实现任何功能的东西。

还有另一种(补充)方法可以实现相同的目的:检测正在访问的内存是否已被删除。例如:

class Node {
public:
    Node()
        { status = 0xf00dbeef; }
    ~Node()
        { status = 0xdeadbeef; }
    // ...
private:
    int status;

    bool isAlive() const
        { return ( status == 0xfoodbeef ); }
};

这样,您始终可以确保您使用的是正确分配的内存,即 a) 未释放,b) 它实际上存储了一个Node对象。

希望这可以帮助。

于 2013-06-17T12:39:33.763 回答