【问题标题】:C++ Memory Management diffrences with Heap Allocation and Frame AllocationC++ 内存管理与堆分配和帧分配的差异
【发布时间】:2011-10-07 01:47:22
【问题描述】:

我对 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% 了解。

【问题讨论】:

  • 您在哪里找到术语“帧分配”?除了上面的正常堆外,没有任何迹象。
  • 我认为它是 MFC 中更多使用的术语,如果我没有得到正确的定义,很抱歉,我在 Qt 中做事,所以我只是想知道非指针对象(QString)是如何工作的与指针对象(QString *)相比,我需要手动执行任何操作来释放它们还是删除指针对象会删除未使用 new 分配的对象?

标签: c++


【解决方案1】:

C++ 中有两种分配规则。堆和栈。我怀疑您在编写“框架”时是指堆栈。有时,尤其是在旧的 C 源代码中,它被称为“自动”。

Demo localDemo;

是您使用堆栈的方式。在此之后执行下一条语句之前,C++ 承诺创建一个 Demo 类型的临时对象并调用无参数构造函数。在当前{} 词法块中引用localDemo 的最后一条语句之后,C++ 承诺调用析构函数并释放存储空间。存储实际上是过程或块的堆栈帧的一部分。

一个相关的问题是类类型的数据成员。如果你写:

class Proletariat {
   private:
      Demo localDemo;
};

那么Proletariat自动生成的构造函数将调用Demo构造函数,而析构函数将始终调用Demo析构函数。

如果你有一个带 args 的构造函数,你可以这样写:

class Proletariat {
   private:
      Demo localDemo;
   public:
      Proletariat() : localDemo("omeD") {}
}

传递这些参数。

};

【讨论】:

  • 因此,如果它包含在一个类中,那么该对象是否会在该类的生命周期内持续存在(如果作为私有变量完成),直到我使用 delete 调用该对象的析构函数?
  • 那完全是另一回事。编辑来了。
  • 谢谢,这帮助我了解了 C++ 内存管理。
【解决方案2】:

在普通 C++ 中,您通常需要为代码中的每个 new(我知道过于简单化)添加一个 delete

在上面的示例中,除了调用delete 之外,您无需进行进一步的内存管理,如已显示的那样。如果你的类有在堆上分配的成员变量(例如,aString 是一个 QString*,你在构造函数中有 new'd,那么在你的析构函数中你也需要删除它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2023-04-06
    • 2017-07-31
    • 2011-05-28
    • 2017-01-04
    • 2010-11-15
    • 2021-03-20
    相关资源
    最近更新 更多