繁体   English   中英

C ++内存管理在堆分配和帧分配方面存在差异

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM