我有一个问题,我很确定我知道它的原因。我想澄清一下。我有一个包含其他类的类,但为了简单起见,我将我的示例限制为两个类。
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);
在那里做什么并没有错?或者我应该只使用指针?
答案 0 :(得分:3)
在这一行:
classB = b(someParam);
表达式b(someParam)
创建一个临时的,无名的b
对象,然后将其赋予成员对象classB
。它是这个无名临时的析构函数,它被调用,而不是你的成员对象的析构函数。如果要避免创建此临时文件,而是使用相应的构造函数直接初始化您的成员对象,请使用初始化列表:
a::a(int someParam)
:classB(someParam)
{}
而且:
classB = *new b(someParam);
即时内存泄漏。您在免费商店中分配一个对象,将其分配给classB
并丢失指针。