C ++需要澄清有关析构函数和范围的内容

时间:2013-10-25 04:52:27

标签: c++ constructor scope destructor

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

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

A.H

#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);在那里做什么并没有错?或者我应该只使用指针?

1 个答案:

答案 0 :(得分:3)

在这一行:

classB = b(someParam);

表达式b(someParam)创建一个临时的,无名的b对象,然后将其赋予成员对象classB。它是这个无名临时的析构函数,它被调用,而不是你的成员对象的析构函数。如果要避免创建此临时文件,而是使用相应的构造函数直接初始化您的成员对象,请使用初始化列表:

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

而且:

classB = *new b(someParam);

即时内存泄漏。您在免费商店中分配一个对象,将其分配给classB并丢失指针。