在C ++中,RAII是否总是在堆栈上分配对象,或者它是否曾使用堆?

时间:2014-07-06 19:08:51

标签: c++ raii

我想知道RAII是否总是在堆栈上分配,或者编译器是否曾将堆用于大型对象(然后可能会将一个令牌添加到堆栈中,作为提醒何时销毁相应的堆分配的提醒对象)?

更新:显然这个问题一直被认为不清楚。也许代码示例会更清楚:

在此代码中:

void dosomething() {
    MyClass myclass();
}

假设编译器没有优化这样一个简单的例子,那么由此创建的MyClass实例是否总是在堆栈上分配,或者是否曾经使用堆?

我认为现在由于接受的答案我理解答案 - 答案似乎是类实例本身在堆栈上,而其内容可能会或可能不会取决于其构造函数的定义方式。如果这不正确,请添加评论/答案。

1 个答案:

答案 0 :(得分:6)

你谈论RAII的方式让人觉得你对RAII 的最基本概念有一些错误的印象。 RAII(也称为SBRM - 堆栈绑定资源管理,因此没有RAII与堆栈的概念完全不正确)基本上是一种编程风格。

使用RAII编写的程序可以并且经常从免费商店分配内存。然而,这种分配由某个类的对象处理。当对象被销毁时,类的析构函数会执行,并释放动态分配的内存。

例如,典型的string对象只包含少量数据,例如指向字符串内容的指针和一个或两个整数来跟踪字符串大小。创建字符串时,它将从免费存储区分配一些空间来保存实际数据。当字符串被销毁时,它将自动释放该数据。在某些情况下,它有一些逻辑可以通过在字符串对象本身中分配一些小的(固定的)空间来避免小字符串的免费存储分配,但不会改变基本思想。

所以,真正的答案是合格的“是”。是的,有一个小对象包含指向堆上分配的一些数据的指针是相当普遍的。是的,当对象本身被销毁时,该对象将释放该内存。但不,这不是编译器你做的事情。相反,它是你在设计和实现类时所做的事情。