如何使用运算符 new 来计算动态内存分配的次数
How to use operator new to count number of times of dynamic memory allocation
给定以下代码:
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 来记录所有动态内存分配。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?