堆栈/堆中的向量元素?长输入,C++

Posted

技术标签:

【中文标题】堆栈/堆中的向量元素?长输入,C++【英文标题】:vectors' elements in stack/heap ? long inputs, c++ 【发布时间】:2013-11-07 15:38:05 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

然后变量 v 被放入栈中。然而,对象本身是 v 分配了一个足够大的堆区,可以容纳 100 个 int 类型的元素。

您可以使用运算符 sizeof 来确定 std::vector 类型的对象本身占用了多少内存。试试这个代码

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

正如您将看到的,std::vector 类型的对象的大小并不取决于该对象可以操作多少项。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于堆栈/堆中的向量元素?长输入,C++的主要内容,如果未能解决你的问题,请参考以下文章

双向链表模板向量中的输入排序(C++)

用户将元素输入到二维向量c++中

将指针向量元素推回非指针向量c ++时出错

C++ 对象存储在堆栈或堆中

C++ 冒泡排序升序 - 不对所有元素进行排序

堆栈内存/堆栈