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

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

我有一个全局 vector ,我将数据加载到其中,然后在我的程序中读取它。

如果我说,将 1000000 个元素推回到这个 vector 中,是否会导致任何问题,例如堆栈溢出?全局范围内有多少内存空间可用?

最佳答案

根据 C++11 第 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.

但是因为内存不足而导致异常与堆栈溢出或静态存储持续时间(“全局”)空间不足导致的损坏相去甚远。

关于c++ - 全局声明的数据结构有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29225349/

相关文章:

c++ - 将右值指定为返回值时出现段错误

c++ - 如何检查用户是否输入?

c++ - 从 HFONT 创建修改后的 HFONT

c++ - Visual C++ vector 删除会增加内存使用量吗?

data-structures - 如何在恒定时间复杂度内在排序链表中插入项目?

C - 构建动态分配的指针数组,指向由文件输入填充的结构

c++ - 原子 CAS 中的后缀评估

c++ - 需要帮助破译 gprof 输出

c++ - 多次 push_back vector 的快速方法

java - java中具有不同数据类型的队列