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

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

本文关键字:C++ 存储 内存 地址 指针 分配 是否      更新时间:2023-10-16

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

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

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

这是真的吗,在C++中我可以确定传递给运算符 delete(或 free(((的指针总是之前分配的指针?

是的,这是真的。它也可以是空指针,在这种情况下,您的函数不应执行任何操作。

此函数的标准库实现的行为是未定义的,除非 ptr 是空指针或以前从operator new...

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

有人可能会编写一个具有重载operator new的类,并且operator delete没有此要求。在这种情况下,它也不会调用您的自定义分配器。

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

分配/解除分配的内存仍然相同,区别在于在释放之前调用哪个析构函数。

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

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