如何使用运算符 new 来计算动态内存分配的次数

How to use operator new to count number of times of dynamic memory allocation

本文关键字:分配 内存 动态 计算 何使用 运算符 new      更新时间:2023-10-16

给定以下代码:

int i;
...
ostingstream os;
os<<i;
string s=os.str();

我想计算以这种方式使用ostringstream时动态内存分配的次数。我该怎么做?也许通过operator new

谢谢。

是的,这是您可以做到的:

#include <new>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
int number_of_allocs = 0;
void* operator new(std::size_t size) throw(std::bad_alloc) {
  ++number_of_allocs;
  void *p = malloc(size);
  if(!p) throw std::bad_alloc();
  return p;
}
void* operator new  [](std::size_t size) throw(std::bad_alloc) {
  ++number_of_allocs;
  void *p = malloc(size);
  if(!p) throw std::bad_alloc();
  return p;
}
void* operator new  [](std::size_t size, const std::nothrow_t&) throw() {
  ++number_of_allocs;
  return malloc(size);
}
void* operator new   (std::size_t size, const std::nothrow_t&) throw() {
  ++number_of_allocs;
  return malloc(size);
}

void operator delete(void* ptr) throw() { free(ptr); }
void operator delete (void* ptr, const std::nothrow_t&) throw() { free(ptr); }
void operator delete[](void* ptr) throw() { free(ptr); }
void operator delete[](void* ptr, const std::nothrow_t&) throw() { free(ptr); }
int main () {
  int start(number_of_allocs);
  // Your test code goes here:
  int i(7);
  std::ostringstream os;
  os<<i;
  std::string s=os.str();
  // End of your test code
  int end(number_of_allocs);
  std::cout << "Number of Allocs: " << end-start << "n";
}

在我的环境(Ubuntu 10.4.3,g++(中,答案是"2"。

<小时 />编辑:引用MSDN

当 new 运算符

用于分配内置类型的对象、不包含用户定义的运算符新函数的类类型的对象以及任何类型的数组时,将调用全局运算符 new 函数。当 new 运算符用于分配定义了运算符 new 的类类型的对象时,将调用该类的运算符 new。

所以每个新表达式都会调用全局operator new除非有类operator new。对于您列出的类,我相信没有类级operator new.

如果要

计算动态分配的对象,您应该通过重载类的 new 运算符来替换它,并在其中添加计数逻辑。

好读:
我应该如何编写符合 ISO C++ 标准的自定义新运算符和删除运算符?

如果您使用的是 Linux (glibc(,则可以使用 malloc hook 来记录所有动态内存分配。