[英]C++ Memory Management diffrences with Heap Allocation and Frame Allocation
对于内存管理在C ++中的工作方式,我有些困惑,我理解您使用指针(新建/删除)时会感到困惑,但是当涉及到帧分配时,我会迷路。
假设我有一个简单的班级(使用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%了解手动内存管理。
C ++中有两种分配规则。 堆和堆栈。 我怀疑您在写“框架”时的意思是堆栈。 有时,尤其是在旧的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") {}
}
传递这些参数。
};
在普通C ++中,您通常需要为代码中的每个new
(我知道过分简化)都需要delete
。
在上面的示例中,除了已经显示的调用delete
之外,您不需要执行其他内存管理。 如果你的班有被分配在堆中的成员变量(例如,ASTRING是为QString *,你有new
的构造函数“d,然后在你的析构函数,你还需要将其删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.