2

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

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

4

2 回答 2

7

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

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 类型的对象的大小不取决于该对象可以操作多少项。

于 2013-11-07T15:45:27.223 回答
1

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

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

于 2013-11-07T15:50:42.790 回答