3

我正在尝试使用getrusage(.)和最大驻留集大小 (maxrss) 来检查内存泄漏。但是,当我故意尝试创建泄漏时,maxrss 不会改变。也许我对 maxrss 的理解不够深入。这是代码:

#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF, &r_usage);
  cout << r_usage.ru_maxrss << "kb\n";
  cout << "Allocating...\n";
  int a = 100000; // have tried range of numbers
  int* memleaktest = new int[a]; // class member
  if(!memleaktest)
    cout << "Allocation failed";
  getrusage(RUSAGE_SELF, &r_usage);
  cout << "after allocation " << r_usage.ru_maxrss << "kb\n";
  return 0;
}

在分配(~15000kb)之后我得到了完全相同的值。在 Ubuntu x86 上。

4

2 回答 2

5

分配的内存在您访问它之前实际上并没有被映射。如果使用值初始化数组,Linux 将被迫实际分配和映射新页面:

#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF, &r_usage);
  cout << r_usage.ru_maxrss << "kb\n";
  cout << "Allocating...\n";
  int a = 1000000;                 // Sufficiently large
  int* memleaktest = new int[a](); // Initialized to zero
  if(!memleaktest)
    cout << "Allocation failed";
  getrusage(RUSAGE_SELF, &r_usage);
  cout << "after allocation " << r_usage.ru_maxrss << "kb\n";
  return 0;
}

在我的系统上,这会导致:

4900kb
Allocating...
after allocation 6844kb

请注意,编译器优化可能会决定数组未使用或应预先分配,因此更喜欢在没有它们的情况下编译或以无法优化的方式重写测试用例。

于 2018-07-11T18:05:42.330 回答
0

由于性能问题,操作系统 (OS) 以块的形式分配资源,并非每个应用程序请求都是新资源。因此,当应用程序中释放一块内存时,操作系统可能仍会保留它所属的块。

为什么?考虑一个应用程序请求 1G 不同的 1 字节内存块。操作系统必须跟踪所有这些,这意味着内存总量为 1G 加上存储对 {begin, size} 以识别每个内存块所需的 2G*sizeof(pair)。

如果您想检测内存泄漏,请使用良好的旧 Valgrind 工具。

于 2018-07-11T17:49:46.710 回答