我有一个加载数据的全局向量,然后在我的程序中读取。
如果我已经说过,1000000个元素被推回到这个向量中,它是否会导致任何问题,比如堆栈溢出造成的问题?全局范围内可用的内存空间是多少?
答案 0 :(得分:1)
根据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.
但由于内存不足导致异常与堆栈溢出或静态存储持续时间(“全局”)空间不足导致的损坏相差甚远。
答案 1 :(得分:0)
问题:
如果我已经说过,1000000个元素被推回到这个向量中,它是否会引起任何问题,例如那些溢出堆栈所产生的问题?
不,它不会。创建std::vector
时,数据的内存是从堆中分配的,而不是从为全局数据保留的内存中分配的。
问题:
全局范围内可用的内存空间是多少?
我没有答案。鉴于第一个问题的答案可能无关紧要。
您可能会发现this answer to another SO post相关。