我对内存管理在C ++中的工作原理感到有些困惑,我理解你何时使用指针(new / delete)但是在框架分配方面我已经迷失了。
假设我有一个简单的类(使用QT类)
class Demo {
public:
Demo();
~Demo();
QString AString() const;
void setAString(const QString &value);
private:
QString aString;
};
我使用指针
分配它Demo *testInst = new Demo();
现在我理解当我称之为“删除testInst;”这是自由的,但我对框架分配中超出范围的部分感到困惑。这是否意味着当我调用delete时,类中所有非指针的人都会被自动释放,或者我是否必须在Demo类的解构器中进行特定的内存管理?或者这是否意味着如果我离开班级那些变量被释放?
我是C ++的新手,来自.NET背景,所以我不是100%了解手动内存管理。
答案 0 :(得分:1)
C ++中有两个分配规则。堆和堆栈。当你写'frame'时,我怀疑你的意思是Stack。有时,特别是在旧C源中,它被称为“自动”。
Demo localDemo;
是你如何使用堆栈。在此之后执行下一个语句之前,C ++承诺创建一个类型为Demo
的临时对象并调用no-args构造函数。在引用{}
的当前localDemo
词汇块中的最后一个语句之后,C ++承诺调用析构函数并释放存储。实际上,存储是过程或块的堆栈帧的一部分。
相关问题是类类型的数据成员。如果你写:
class Proletariat {
private:
Demo localDemo;
};
然后Proletariat
的自动生成的构造函数将调用Demo
构造函数,析构函数将始终调用Demo
析构函数。
如果你有一个带args的构造函数,你可以写一下:
class Proletariat {
private:
Demo localDemo;
public:
Proletariat() : localDemo("omeD") {}
}
传递那些参数。
};
答案 1 :(得分:0)
在普通的C ++中,对于代码中的每个delete
(我知道过度简化),您通常需要new
。
在上面的示例中,除了调用已显示的delete
之外,您不需要进行任何进一步的内存管理。如果你的类具有在堆上分配的成员变量(例如,aString是你的构造函数中有new
'的QString *,那么在你的析构函数中你还需要删除它。