C ++内存管理与堆分配和帧分配的差异

时间:2011-10-07 01:47:22

标签: c++

我对内存管理在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%了解手动内存管理。

2 个答案:

答案 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 *,那么在你的析构函数中你还需要删除它。