我应该检查NULL在我的赋值操作符

Should I check for NULL in my assignment operator?

本文关键字:我的 赋值操作符 NULL 检查 我应该      更新时间:2023-10-16

我有一个class

class Node {
  public:
    int value;
    Node * next;
    Node();
    Node(const Node& other);
    Node& operator= (const Node& other);
};

它不是很有用,但它有一个覆盖的赋值操作符。这里的一切都是public,因为我是一个如此开放和合作的人。

现在我在其他地方有一个这些节点的数组:

Node * nodes = new Node[15];

当我尝试将一个节点分配给我的节点数组时:

nodes[0] = Node();

我得到一个巨大的丑陋的崩溃。

我的赋值操作符是这样的:

Node& Node::operator= (const Node& other) {
  // watch out for self assignment
  if (this == &other) return *this;
  delete this->next;
  this->next = new Node(*(other.next)); // call the copy constructor
  this->value = other.value;
  return *this;
}

我觉得我应该先检查this是不是NULL,然后再去解引用它的成员。有什么问题吗?

永远不要检查this是否为NULL;在合法对象之外调用非静态成员函数是非法的。

您可能必须确保赋值中源对象和目标对象的next指针成员变量为空或指向有效对象。在没有看到实际代码的情况下,不可能说您现在拥有的构造函数是否正确地执行此操作。

问题是您正在解引用other.next,它可能是NULL。所以你应该在解引用other.next之前检查它是否为空:

this->next = other.next ? new Node(*other.next) : 0;

解除NULL指针的引用是未定义的,所以如果你这样做,任何事情都可能发生——它可能不会立即崩溃,而是游荡到意想不到的地方,让你和调试器都感到困惑。

我认为您不应该检查NULL。我认为你的所有权在这里没有明确规定。谁拥有下一个节点?

This ->next或other ->next可能为空,因此在删除/解引用前检查。

如果不了解你的代码,很难说你想要实现什么。

this永远不会是NULL,然而在你的例子中,this->next将是NULL或nodes[0]的无效引用,因为这个对象从未被初始化(我不太确定编译器做什么,也许它用零填充数组,也许不是)。我建议你提防delete this->next;的NULL指针,并确保你的数组在你分配它之后是空的。例如:

Node * nodes = new Node[15] {0};

if (this->next) delete this->next;