2

在一个类的构造函数中,我创建了一个具有所需大小的数组,如下所示:

ArrayClass::ArrayClass(int size) 
{
    Number* nmbr = new Number[size];
}

ArrayClass::ArrayClass()
{ 
    Number* nmbr = new Number[2];
}

我也在标题中将其指定为

Number* nmbr;

虽然数组本身的创建有效,但我似乎无法在构造函数之外访问它。似乎每当我离开构造函数时,变量就会从内存中释放出来。如何防止这种情况,以便在调用类中的其他函数时可以使用该变量?

4

3 回答 3

6

不要创建新变量。您的nmbr构造函数中的 彼此不同,并且标题中的不同。

如果您必须使用全局变量(三思而后行),请将其声明为extern,在单个 TU 中定义它,然后使用

 nmbr = new ArrayClass[2];

在你的构造函数中。

不要忘记清理内存或关于三规则。

于 2013-01-17T15:06:08.217 回答
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;

}
于 2013-01-17T15:14:44.073 回答
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 的旧规则三的更新),或者,根据强烈偏好,使用 astd::vector<Number>代替,因此它可以遵循“零规则”。

于 2013-01-17T15:22:00.040 回答