在类的构造函数中,我创建了一个具有所需大小的数组:
ArrayClass::ArrayClass(int size)
{
Number* nmbr = new Number[size];
}
和
ArrayClass::ArrayClass()
{
Number* nmbr = new Number[2];
}
我也在标题中指定为
Number* nmbr;
虽然数组本身的创建工作,但我似乎无法在构造函数之外访问它。似乎每当我离开构造函数时,变量都会从内存中释放出来。如何防止这种情况,以便在调用类中的其他函数时可以使用变量?
答案 0 :(得分:6)
不要创建新变量。构造函数中的nmbr
彼此不同,标题中的extern
也不同。
如果你必须使用全局(想三次这样做)将其声明为 nmbr = new ArrayClass[2];
,在单个TU中定义它,并使用
{{1}}
在你的构造函数中。
不要忘记清理记忆或三个规则。
答案 1 :(得分:2)
尝试在类的声明中声明变量nmbr,而不是在构造函数中声明。 例如:
class ArrayClass
{
private:
Number *nmbr;
public:
ArrayClass();
ArrayClass(int size);
~ArrayClass()
}
ArrayClass::ArrayClass(int size)
{
this->nmbr = new Number[size];
}
ArrayClass::ArrayClass()
{
this->nmbr = new Number[2];
}
ArrayClass::~ArrayClass()
{
delete this->nmbr;
}
答案 2 :(得分:1)
如果将所有代码放在一个地方,最容易看到问题。
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的旧规则更新为3)或者,强烈偏好,请改用std::vector<Number>
,以便它可以跟随“rule of zero”。