我应该检查NULL在我的赋值操作符
Should I check for NULL in my assignment operator?
我有一个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;
- 在我的赋值运算符中使用STL容器的赋值运算符是否会泄漏内存
- 带引用类成员的赋值操作符
- 带有映射的赋值操作符
- 重写std::string的赋值(=)操作符
- c++中双重链表的赋值操作符
- 对象的赋值操作符
- 模板化类的赋值操作符
- 我应该检查NULL在我的赋值操作符
- Visual c++ 2010 / QT:为什么要调用类的赋值操作符
- 带有派生类型参数的赋值操作符
- 如何重载c++中的赋值操作符?
- 对象上的赋值操作符
- 重载没有返回语句的赋值操作符
- 移动QWidget派生的赋值操作符
- 用C API重写Lua中的赋值操作符
- 如何查明函数模板中的赋值操作符T是否抛出异常
- 模板类c++的赋值操作符
- 当我从赋值操作符返回值时,首先,调用复制构造函数的机制和基础是什么?
- 字符串的赋值操作符
- 采用不同数据类型的赋值操作符的名称是什么?