我通过重载我的基类的new和delete操作符来创建自己的内存管理器。重载运算符维护一个内存分配的链接列表,我还存储分配的文件和行号。它也适用于多重继承,因为删除操作符始终接收正确的内存地址(即我从'new'返回的地址)。获取对象的内存地址(即第一个父项的内存地址)的最佳方法是什么?
我想创建一些方法,在运行时,可以返回分配文件和行号。对于多重继承,'this'指针可能不指向正确的内存地址(有时会偏移8个字节)。我理解为什么它是偏移的,但我正在寻找一种方法来可靠地计算新运算符最初返回的正确内存地址。
答案 0 :(得分:2)
如果类层次结构是多态的,则可以使用dynamic_cast<void*>(this)
来获取*this
是子对象的派生对象最多的地址。
如果您的类层次结构不是多态的,那么您无法动态地知道给定的基础对象是否是最大的派生对象,如果不是,则无法知道它的派生对象是什么。但是,在这种情况下,您也无法销毁该对象,因为您无法访问最派生的析构函数,因此通常不需要释放内存。但是,如果无法确定其派生的最大对象,则无法查找对象的分配跟踪。
答案 1 :(得分:0)
你不能这样做。允许每个C ++编译器对从operator new
返回的存储执行任何操作。它可以选择任何类型的布局,然后new
操作的结果是指向运算符返回的内存中某处的指针。最派生对象的地址与运算符返回的值不同。
由于您尚未指定使用某些特定编译器的特定版本,因此没有人能够根据与实现相关的细节知识给出答案。