c++ - 当前大小未知但堆栈无法容纳时动态分配内存

标签 c++ c++11 memory-management

我正在用 C++ 模拟最佳页面替换算法。大量格式为 (hex, 'w' or 'r') 的页面请求将被预处理,以在不同的时间步长为每个页面设置请求链。

目前我在做:

    ifstream in(argv[1]);
    unordered_map<unsigned int, queue<unsigned int>> distance_map;
    unsigned int addr, distance = 0;
    char mode;
    while(in >> hex >> addr >> mode)
    {
        if(distance_map.find(addr) == distance_map.end())
           distance_map.emplace(addr, queue<unsigned int>());
        distance_map.at(addr).push(distance);
        distance++;
    }

现在使用小输入文件没问题,但评分者将使用“大得多”的文件测试我的程序。因此,我想在堆中分配内存。找了半天,发现更多问题:

  1. C++ 程序员建议不要使用指向对象的指针。那就是不要使用 unordered_map<K, T> *map_ptr .但我不明白为什么这通常是一件坏事。 map.insert(...) 之间有什么区别?和 map_ptr->insert(...) ?

  2. 我可以使用unique_ptr吗?对于每个 queue<unsigned int>将举行的实例?队列在动态增长,unsigned int 也是如此。 s 队列包含仍然驻留在堆栈中?

我希望有经验的 C++ 程序员能告诉我在这种情况下该怎么做,并回答我上面的两个问题。

最佳答案

所有使用分配器的 STL 容器(除了 std::array 及其衍生物)都将它们的项目存储在动态分配的内存中(通常实现为堆)。

原始指针在 C++ 中通常不好,因为它们会破坏 RAII idiom因此容易发生内存泄漏。

您可以在容器内使用unique_ptr,只是要注意默认构造函数将它们设置为null。通常,它们仅对多态有用。

关于c++ - 当前大小未知但堆栈无法容纳时动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361639/

相关文章:

c++ - Qt 设置 QWidget 的默认宽度

c++ - 如何在 OS X 上获取 USB 驱动器的硬盘驱动器序列号?

c++ - Ncurses 不滚动 stdscr,导致终端行为异常

python - 为什么我的 Fortran 代码用 f2py 包装使用了这么多内存?

java - Android Activity 内存管理

c++ - 使用 boost 在文件中查找正则表达式

c++ - 在wxWidgets中创建一个全局的wxCriticalSection变量不好吗?

C++ 11为什么在返回临时对象之前调用移动构造函数

c++ - 同时使用 std::regex,定义的行为?

memory - 增加 sas 内存/内存大小