是否可以仅通过在 C++ 中存储分配的指针地址来分析内存?

Is it possible to profile memory only by storing allocated pointer address in C++?

我想创建一个简单的内存分析器。它将存储由运算符 new(或直接从 malloc())返回的与分配的大小相关联的地址——作为某个数据库中的事件。然后我想仅使用传递给运算符 delete(或 free())的地址来跟踪释放。

在 C++ 中,我可以确定传递给运算符 delete(或 free())的指针始终是先前分配的指针吗?

我怀疑 C++ 分配器中是否有一些隐藏的指针算法,允许删除向上转换或向下转换的指针而不是原始指针。

Is it true, that in C++ I can be sure that pointer passed to the operator delete (or free()) always will be the one previously allocated?

是的,这是真的。它也可以是一个空指针,在这种情况下你的函数应该什么也不做。

The behavior of the standard library implementation of this function is undefined unless ptr is a null pointer or is a pointer previously obtained from the standard library implementation of operator new...

由于大多数代码是为 operator new/delete 的标准库实现编写的,它不会将其他指针传递给 operator delete

有人可以写一个 class 重载 operator newoperator delete 而没有这个要求。在那种情况下,它也不会调用您的自定义分配器。

I'm in doubt if there is some hidden pointer arithmetic inside C++ allocator, that allows to delete upcasted or downcasted pointers instead of original ones.

allocated/deallocated内存还是一样的,不同的是释放之前调用了哪个析构函数。

在调试级别,您有相同的指针。可以通过重载运算符 new/delete 来实现一个简单的内存分析器。你可以有一个存储指针的地图,并检查是否有一些以前没有用你的新运算符存储的东西被传递给删除。

此外,您可能想要分析 C++ 级别之外的内存分配。 Windows、VirtualAlloc、COM内存、句柄等