gpt4 book ai didi

c++ - 为什么 std::map< std::map > 不释放内存?

转载 作者:可可西里 更新时间:2023-11-01 16:01:12 49 4
gpt4 key购买 nike

在下面的测试程序中,std::map分配的内存没有被释放。总而言之,我们分配了大约 2.2 GB 的内存,尽管我们用一个空容器进行了交换,但它从未被释放。

更改 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;
}

最佳答案

std::map内部使用黑/红树存储对象,其中包含很多小对象,而std::vector连续存储对象,使用一个大平面内存块。

glibc 以不同的方式维护不同类型的内存。

在请求小对象时,通常使用内存池来避免外部碎片,但是当对象释放时会造成内部碎片,并且内部碎片永远不会返回给系统。

当请求大块时,glibc 会分配一个大内存块,其中可能包含外部碎片。但释放后,内存将返回给系统。

关于c++ - 为什么 std::map< std::map > 不释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37587200/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com