我应该在赋值运算符中检查NULL吗?

时间:2011-10-07 23:20:07

标签: c++ assignment-operator

我有一个班级

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。关于可能出错的任何想法?

4 个答案:

答案 0 :(得分:2)

您永远不应该检查thisNULL;调用非静态成员函数而非有效对象是非法的。

您可能必须确保赋值中的源对象和目标对象的next指针成员变量为空或指向有效对象。如果没有看到真正的代码,就不可能说出你现在拥有的构造函数是否正确地执行了这一操作。

答案 1 :(得分:1)

问题是您要取消引用other.next,它可能是NULL。因此,在解除引用之前,您应该检查other.next是否为空:

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

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

答案 2 :(得分:0)

我认为你不应该检查这是否为NULL。 我相信你的所有权在这里设置不明确。谁拥有下一个节点?

这个 - >下一个或其他 - > next可能为null,因此请在删除/取消引用之前检查。

在不了解您的代码的情况下,很难说出您想要实现的目标。

答案 3 :(得分:-1)

this永远不会是NULL,但是在您的示例中this->next将是NULL或nodes[0]的无效引用,因为此对象从未出现过初始化(我不太确定编译器做了什么,也许它用零填充数组,也许不是)。我建议你防止delete this->next;的NULL指针,并确保你的数组在分配后被清空。即做出这些改变:

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

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