-1

我有一个问题,我很确定我知道它的原因。我只是想澄清一下。我有一个包含其他类的类,但为简单起见,我将示例限制为两个类。

A类包含B类。在A类的构造函数中,它通过调用B的构造函数来初始化B类。在 A 类的构造函数结束时,B 类的析构函数被调用,这不是我所期望的行为。这是一个例子......

#include "b.h"

class a {
    public:
        b classB;

        a(int someParam);
};

a.cpp

#include "a.h"

//Class A's constructor
a::a(int someParam) {
    //Set class B by calling it's constructor
    classB = b(someParam);
    //Now class B's destructor gets called when exiting A's constructor...
}

我知道如果你声明一个变量而不使用“new”,它会在离开当前范围时被销毁。但我一直认为这适用于变量的范围,而不适用于您为其赋值的范围。这就是问题所在,对吧?如果是,那么做事classB = *new b(someParam);就没有错吗?还是我应该只使用指针?

4

1 回答 1

3

在这一行:

classB = b(someParam);

该表达式b(someParam)创建一个临时的无名b对象,然后将其分配给成员对象classB. 调用的是这个无名临时对象的析构函数,而不是成员对象的析构函数。如果您想避免创建此临时对象,而是使用适当的构造函数直接初始化您的成员对象,请使用初始化列表:

a::a(int someParam)
    :classB(someParam)
{}

和这个:

classB = *new b(someParam);

是即时内存泄漏。您正在自由存储上分配一个对象,将分配从它复制到classB,并丢失指针。

于 2013-10-25T05:00:09.700 回答