矢量'堆栈/堆中的元素?长输入,c ++

时间:2013-11-07 15:38:05

标签: c++ memory vector stack heap

我有一个问题 据我所知,如果我收到很多元素并将它们放入堆栈中,那么进程可能会崩溃,堆应该更安全更大,所以,当我分配时 矢量v和插入元素,它们将存储在堆中,如其他主题中的答案对吗? 所以我的程序因长输入而无法崩溃,对吗?

另外,矢量在堆中是什么意思,不是矢量对象只是指向包含元素的第一个地址的指针,除了一些其他函数

2 个答案:

答案 0 :(得分:6)

std :: vector的对象是在堆栈(或静态内存)中创建的,如果你不打算使用operator new在堆中有意创建它们。但是向量包含的项目是在堆中创建的。例如,您在某个函数中以下列方式定义向量

std::vector<int> v( 100 );

然后将变量v放在堆栈中。但是,v的对象本身会分配一个足够大的堆,以容纳100个int类型的元素。

您可以使用operator size来确定占用std :: vector本身类型的对象的内存量。试试这段代码

std::vector<int> v( 100 );
std::cout << sizeof( v ) << std::endl;

正如您将看到std :: vector类型的对象的大小不依赖于对象可以操作的项目数。

答案 1 :(得分:1)

如果您正在处理大量数据,并且如果您不确切知道将会有多少数据,那么堆存储通常是正确的选择。如果你试图使用太多(这是一个有限的资源),你的程序仍然会耗尽内存。通常,这将导致抛出bad_alloc异常,但如果您没有捕获并处理它,那么您的程序会有效崩溃。确切的可用内存取决于很多因素,包括操作系统,硬件和编译器配置。

你是正确的,标准vector类通常将数据存储在堆上,尽管对象本身可能在堆栈上(取决于你如何声明它)。在内部,您可以将其视为动态数组(使用new []分配),并在必要时重新分配。严格来说,它可能不会以这种方式实现,但在功能上它是类似的。