我有一个班级
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
。关于可能出错的任何想法?
答案 0 :(得分:2)
您永远不应该检查this
是NULL
;调用非静态成员函数而非有效对象是非法的。
您可能必须确保赋值中的源对象和目标对象的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;