【发布时间】:2018-02-02 10:05:32
【问题描述】:
下面是我的问题和代码:
- 当代码运行到第26行时,这个进程获得的内存没有返回给OS?
- 但是,如果我删除第16行,内存会被正确释放吗?
我知道这不是使用这么多小内存块的常规方式,但我很想知道原因。
我用MALLOC_MMAP_MAX_=1000000 MALLOC_MMAP_THRESHOLD_=1024, 运行了这个程序,但没有任何改变。
int i = 0;
std::cout << "waitting for input, you can check current memory" << std::endl;
std::cin >> i;
char** ptr = new char *[1000000];
std::map<int, char *> tMap;
for (unsigned long i = 0; i < 1000000; i ++)
{
ptr[i] = new char[3000];
tMap.insert(make_pair(i, ptr[i])); //line 16
}
std::cout << "waitting for input, you can check current memory" << std::endl;
std::cin >> i;
for (unsigned long i = 0; i < 1000000; i ++)
{
delete []ptr[i];
}
delete []ptr;
std::cout << "waitting for input, you can check current memory" << std::endl;
std::cin >> i; //line 26
return 0;
这里的资料比较多,我查过tMap的内存,不到100M。
1、分配内存并停止,检查内存资源:
2、释放内存并停止,检查内存资源:
【问题讨论】:
-
你怎么知道的?
-
请注意,您周围有几个名为
i的变量,这很危险,可能会导致编译器使用您认为会使用的另一个变量。它在这里可能很好用,但这是一种危险的习惯,避免它。
标签: c++ memory-leaks