【问题标题】:How to track the memory allocation when using smart pointer使用智能指针时如何跟踪内存分配
【发布时间】:2016-08-25 07:57:00
【问题描述】:

我正在尝试创建一个跟踪类来跟踪内存分配。例如打印在应用程序中分配了多少字节。对于使用 new/delete 运算符的变量。我可以使用运算符 new/delete。但是智能指针分配的内存呢?

#include <memory>
#include <iostream>

using namespace std;
template<T>
class MemoryTracking : std::enable_shared_from_this<MemoryTracking<T> >
{
public:
  static size_t s_total;
  void* operator new (const size_t s)
  { 
    s_total += s; 
    return ::operator new[](s);
  }
  void* operator new[](const size_t s)
  { 
    s_total +=s; 
    return ::operator new[](s);
  }
  void delete(void *p, size_t s) noexcept
  {
    s_total -= s;
    ::operator delete(p);
  }
  void delete[](void *p, size_t s) noexcept
  {
    s_total -= s;
    ::operator delete[](p);
  }

  // for shared_ptr
  MemoryTracking() throw() {};
  MemoryTracking(const MemoryTracking& other) throw() {};

  MemoryTracking<T>& operator = (const MemoryTracking<T>& other) { return *this; }
  MemoryTracking<T>& operator = (const MemoryTracking& other) { return *this; }
  ~MemoryTracking() {}

  T* allocate(size_t n, const void* hint = 0)
  {
    return static_cast<T*>(::operator new(n * sizeof(T)));
  }

  void deallocate(T* ptr, size_t n)
  {
    ::operator delete(ptr);
  }

  template <typename U>
  inline bool operator == (const MemoryTracking<U>&)
  {
    return true;
  }

  template <typename U>
  inline bool operator != (const MemoryTracking<U>& obj)
  {
    return !(*shared_from_this() == obj);
  }
};

class A : public MemoryTracking<A>
{
}

int main()
{
  auto ptr = make_shared<A>();
  cout << MemoryTracking::s_total << endl;
}

【问题讨论】:

  • This 似乎回答了你的问题。 make_shared (可能)使用全局布局 new。
  • 有点,但不是真的,我知道理想情况下,我需要使用 allocate_shared 创建 shared_ptr,它需要一个 allocator_traits 来分配内存。但我只是不确定我能做到这一点。而且我不确定如何跟踪 unique_ptr 分配的内存,因为没有 allocate_unique。

标签: c++ memory smart-pointers


【解决方案1】:

如果您想跟踪应用程序中分配的所有内存,您可能需要覆盖malloc()realloc()calloc()free()。通过覆盖这四个,您不仅可以捕获 C++ 分配,还可以捕获 C 分配。

有关如何包装malloc() 等函数,请参阅:How to reimplement (or wrap) a syscall function in linux?Globally override malloc in visual c++

【讨论】:

  • 感谢您的回答,我在 windows 上。看来我不能在 win 系统上重载 malloc、realloc、calloc 和 free。
  • 您也可以在 Windows 上执行此操作——请参见此处:stackoverflow.com/questions/1316018/…
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2012-06-10
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多