我有一个全局向量,我将数据加载到该向量中,然后在稍后的程序中读取该向量。
如果我说,1000000个元素被推回这个向量,它会引起任何问题吗,比如那些溢出堆栈所产生的问题?在全局范围内有多少可用内存空间?
根据C++11 section 23
,除非您的类型提供专门的分配器,否则序列容器(如vector
)将使用std::allocator
,后者使用new
获取内存。换句话说,使用动态内存分配函数(外行的说法是"来自堆")。
因此,只要你遵守规则,就没有办法使用该容器破坏堆栈,如果你做了这样的事情,可能会出现这种情况:
void function(void) {
int xyzzy[999999999];
:
}
这并不是说你不能耗尽内存,堆的大小并不是无限的,如下面的代码所示:
#include <iostream>
#include <vector>
int main (void) {
std::vector<const char*> *v = new std::vector<const char*>();
long count = 0;
while (1) {
try {
v->push_back("xyzzy");
count++;
} catch (std::exception &e) {
std::cout << e.what() << 'n';
break;
}
}
std::cout << count << " pushbacks done.n";
return 0;
}
输出(在我的系统上):
std::bad_alloc
134217728 pushbacks done.
但是,由于内存不足而导致异常与堆栈溢出或静态存储持续时间("全局")空间不足导致的损坏相去甚远。
问题:
如果我说,1000000个元素被推回这个向量,它会引起任何问题吗,比如那些溢出堆栈所产生的问题?
不,不会的。创建std::vector
时,数据的内存是从堆中分配的,而不是从为全局数据保留的内存中分配的。
问题:
在全局范围内有多少可用内存空间?
我对此没有答案。考虑到第一个问题的答案,这可能无关紧要。
你可能会发现这个答案与另一篇SO帖子相关。