【问题标题】:How to use operator new to count number of times of dynamic memory allocation如何使用operator new来统计动态内存分配的次数
【发布时间】:2012-03-29 14:50:03
【问题描述】:

给定以下代码:

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

我想统计这种方式使用ostringstream时动态内存分配的次数。我怎样才能做到这一点?也许通过operator new?

谢谢。

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的,你可以这样做:

    #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运算符用于分配内置类型的对象、不包含用户定义的operator new函数的类类型的对象以及任何类型的数组时,调用全局operator new函数。当 new 运算符用于分配定义了 operator new 的类类型的对象时,将调用该类的 operator new。

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

    【讨论】:

    • 我明白了。所以operator new 是全局的,因为每个动态内存分配都需要调用重新定义的版本(如果存在),对吗?
    • 恕我直言,删除应检查 ptr 是否为非空。
    • @zzz777 感谢您的评论,但我不同意。 free() 被定义为在传递空指针时不执行任何操作。添加支票是多余的。
    【解决方案2】:

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

    好读:
    How should I write ISO C++ Standard conformant custom new and delete operators?

    【讨论】:

    • @littleEinstein:检查链接。
    • 对,我在一定程度上知道operator new 是如何工作的。但我不确定如何使用ostringstream 应用它。我“非常”需要一个具体的例子。 :)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2017-01-31
      • 2014-01-23
      • 2013-05-03
      • 1970-01-01
      • 2018-10-08
      • 2022-06-28
      相关资源
      最近更新 更多