Согласно стандарту, когда вызывается деструктор std :: unordered_map (например, когда он покидает область, в которой он создан), ожидается, что память, которую он выделяет, будет освобождена. Однако простой эксперимент, который я проводил на нескольких машинах, кажется, противоречит этому? Рассмотрим следующую программу:
#include <chrono>
#include <iostream>
#include <map>
#include <unordered_map>
#include <memory>
#include <thread>
#include <vector>
void CreateMap() {
std::unordered_map<int, int> testMap;
for (int i=0; i < 10000000; i++) {
testMap[i] = 5;
}
std::cout << "finished building map" << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(15));
std::cout << "about to exit from CreateMap()" << std::endl;
}
int main()
{
CreateMap();
CreateMap();
CreateMap();
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
На моей машине 10% оперативной памяти используется, когда карта заканчивается, но мы в конце спим в CreateMap (). Однако после выхода из ОЗУ снижается только до 8% (можно играть с картами разных размеров, чтобы показать, что сама карта отвечает за более чем 2%), поэтому можно ожидать, что CreateMap утечка памяти? Однако 3 вызова CreateMap () или только один вызов, кажется, не имеют значения (поэтому память используется программой, а не ОЗУ?).
Может ли это быть чем-то странным в управлении памятью ОС, что я не понимаете, т. е. возможно ли, чтобы программа освободила память для своего собственного будущего использования (распределения в будущем), но не для ОС (т. е. для выделения памяти в других программах)?