2011-10-07 87 views
1

我对C++中的内存管理是如何工作有些困惑,我理解你什么时候使用指针(新/删除),但是在帧分配时我会丢失。C++内存管理与堆分配和帧分配的区别

说我有一个简单的类(使用Qt类)

​​

我使用指针

Demo *testInst = new Demo(); 

现在我明白了,当我打电话给它分配 “删除testInst;”这是释放,但我对框架分配超出范围部分感到困惑。这是否意味着当我调用delete时,类中所有不是指针的类都会自动释放,还是必须在Demo类的解构器中进行特定的内存管理?或者这意味着如果我离开这些类,那些变量就被释放了?

我是C++的新手,来自.NET背景,因此我不是100%理解手动内存管理。

+1

您在哪里找到“帧分配”这个术语?除了上面的正常堆以外没有其他任何标志。 – bmargulies

+0

我认为它的一个术语更多地用在MFC中,所以对不起,如果我没有得到正确的定义,我在Qt中做事情,所以我只是想知道非指针对象(QString)在指针对象(QString) *)我是否需要手动执行任何操作来释放它们,或者是否删除指针对象删除没有使用新指针分配的对象? – DrHouse

回答

1

在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") {} 
} 

通过这些ARGS。

}; 
+0

因此,如果它包含在一个类中,那么这个对象是否会终结类的生命(如果作为私有变量完成),直到我使用delete调用该对象的析构函数? – DrHouse

+0

这完全是另一回事。编辑即将到来 – bmargulies

+0

谢谢,这帮助我理解C++ Mem管理。 – DrHouse

0

在普通的C++,你通常会需要为每一个newdelete(过于简单化,我知道)这是在你的代码。

在上面的示例中,除了调用delete之外,您不需要执行进一步的内存管理,如前所述。如果您的类具有在堆上分配的成员变量(例如,aString是在构造函数中有new'd的QString *,那么在您的析构函数中,您还需要将其删除)