gpt4 book ai didi

c++ - 使用智能指针时如何跟踪内存分配

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:25 26 4
gpt4 key购买 nike

我正在尝试创建一个跟踪类来跟踪内存分配。例如打印在应用程序中分配了多少字节。对于使用 new/delete 运算符的变量。我可以使用 operator 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;
}

最佳答案

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

关于如何包装像 malloc() 这样的函数,参见:How to reimplement (or wrap) a syscall function in linux?Globally override malloc in visual c++

关于c++ - 使用智能指针时如何跟踪内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36950473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com