全局声明的数据结构有多大?

时间:2015-03-24 05:03:44

标签: c++ vector data-structures global-variables heap

我有一个加载数据的全局向量,然后在我的程序中读取。

如果我已经说过,1000000个元素被推回到这个向量中,它是否会导致任何问题,比如堆栈溢出造成的问题?全局范围内可用的内存空间是多少?

2 个答案:

答案 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相关。