堆栈中的对象与C ++中堆上的对象

时间:2015-11-03 23:03:50

标签: c++

我是C ++的新手,发现在C ++中,你有2个方法来创建一个对象:堆栈上的对象和堆上的对象。

但我很想知道在堆栈上使用对象与堆上的对象有什么优缺点。

在什么情况下,第一种方法优于第二种方法,反之亦然?

2 个答案:

答案 0 :(得分:1)

堆栈上的对象具有非常简洁的属性,在该堆栈帧的末尾自动释放支持它们的内存(例如,当函数返回时).C ++通过调用扩展了这个概念所有堆栈对象的析构函数每当它们超出范围时(即在函数返回之前抛出异常的情况下它们仍然被释放。)因为这会使内存管理变得简单,并且内存管理错误具有易于制作和难以检测的令人沮丧的组合,只要可行,堆栈分配应该是首选。

堆栈分配对象的缺点是......好吧......当函数返回时它们被删除了。有时候有合理的理由希望对象能够活得更久。在这些情况下,您别无选择,只能从堆中进行分配。

要考虑的另一点是,堆栈分配几乎必须是编译软件时已知的大小(但请参阅某些平台上可用的alloca函数。)有一吨现实世界的场景,在程序运行之前你不会知道你需要多少内存。以地址簿应用程序为例。如果我正在编写这样的应用程序,我显然不知道最终用户在他们的地址簿中想要多少人。用户必须告诉程序该信息。在这种情况下,您需要动态分配内存,因此您将再次查看堆分配。

答案 1 :(得分:0)

堆栈几乎总是可取的。您的对象可能管理堆上的数据,如std::string,在这种情况下,对象本身在堆栈上维护(与任何其他本地变量一样),并且字符串数据在堆上。

堆栈很快。堆很慢。 堆栈用于小数据。堆用于大数据。

希望这有帮助。