在以下测试程序中,由
当将
我已经使用valgrind检查了代码,但明显没有发现任何泄漏。
为什么会出现这种情况,我该如何改变这种行为?
std::map
分配的内存未被释放。总的来说,我们分配了大约2.2GB的内存,虽然我们与一个空容器交换了,但这些内存从未被释放。当将
std::map< std::map >
更改为 std::map< std::vector >
时,内存实际上被释放了。我已经使用valgrind检查了代码,但明显没有发现任何泄漏。
为什么会出现这种情况,我该如何改变这种行为?
#include <cstdlib>
#include <iostream>
#include <vector>
#include <map>
#include <chrono>
#include <thread>
class Test
{
public:
std::vector< std::pair< int, int > > myContainer;
std::map<int,int> myMap;
Test(){
for( int i = 0 ; i < 10000; i++ ){
std::pair<int, int> pair = std::make_pair<int, int>( rand(), int( i ) );
//myContainer.push_back( pair );
myMap.insert( pair );
}
}
};
int main()
{
std::map<int,Test> myContainer1;
for( int i = 0 ; i < 5000; i++ ){
myContainer1.insert( std::make_pair<int, Test>( rand(), Test() ) );
}
std::cout << "ready!" << std::endl;
std::this_thread::sleep_for( std::chrono::milliseconds( 5000 ) );
std::cout << "cleaning..." << std::endl;
{
std::map<int,Test> tmp;
myContainer1.swap( tmp );
}
std::cout << "cleaning ready!" << std::endl;
std::this_thread::sleep_for( std::chrono::milliseconds( 15000 ) );
return 0;
}
map<vector>
时,我发现进程的 RSS 下降到几 MB。而当使用map<map>
时,RSS 保持在 2 GB。 - bicuvalgrind
通常会报告程序结束时仍有多少内存分配,并且比查看资源监视器统计数据更可靠。你在那里看到了什么值? - Andrewmunmap
立即浮现在脑海中)。这可能取决于 stdlib 实现(或底层 libc)如何处理释放。也有可能向量(连续存储)和映射(可能不是)之间的差异会影响内存的清理和分页速度/易用性。 - Andrew