如果将所有代码放在一个地方,可能最容易在这里发现问题。
Number *nmbr;
class ArrayClass {
Number *nmbr;
public:
ArrayClass() {
Number *nmbr = new Number[2];
}
};
您在这里拥有的是三个不同范围内的三个完全独立的变量。每个都在外部范围内“隐藏”任何同名变量。
这也意味着当您在构造函数中进行初始化时nmbr
,您只是在初始化构造函数本身的本地变量。当ctor返回时,该指针将被丢弃,并且您分配的内存将被泄漏。同样糟糕的是ArrayClass::nmbr
,您(几乎可以肯定)想要初始化的那个仍然没有被初始化。
类外的nmbr
几乎相同,但在某种程度上更安全:因为它是全局的,它将被零初始化;因为它是一个指针,这意味着它将被初始化为一个空指针(所以它没有指向任何数据,但至少它很容易测试并且知道它不是)。
为了防止这种情况,您可能希望消除变量的额外定义,因此所有引用都nmbr
指向同一事物:
class Array {
Number *nmbr;
public:
Array() : numbr(new Number[2]) {}
};
由于此类似乎在进行远程所有权(即,它通过指针分配和拥有数据),您需要遵循五规则(对 C++11 的旧规则三的更新),或者,根据强烈偏好,使用 astd::vector<Number>
代替,因此它可以遵循“零规则”。