我正在用 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++;
}
现在使用小输入文件没问题,但评分者将使用“大得多”的文件测试我的程序。因此,我想在堆中分配内存。找了半天,发现更多问题:
C++ 程序员建议不要使用指向对象的指针。那就是不要使用
unordered_map<K, T> *map_ptr
.但我不明白为什么这通常是一件坏事。map.insert(...)
之间有什么区别?和map_ptr->insert(...)
?我可以使用
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/