3

在我的代码中,我重载了newanddelete运算符来获取文件名和行号。在我的代码中,我使用mapand stack。当我从映射中删除特定值时,它只是调用我的重载delete函数,但我只希望显式delete语句能够访问我的函数,而不是其他函数。我怎样才能做到这一点?

4

2 回答 2

3

如果您只希望自己的 delete 调用您的重载,我不会重载 delete 运算符,而是制作一个自定义方法,如 DeleteMyObject 它将调用原始删除,然后创建一个宏来调用此函数并用此宏替换所有删除.

喜欢

#define DELETE_MY_OBJECT(obj) DeleteMyObject(obj, __FILE__, __LINE__)

该方法可能看起来像

void DeleteMyObject(void* obj, char* file, char* line)
{
    // Log delete
    ...

    delete obj;
}

然后在你的代码中

MyObj* obj = ...
...
DELETE_MY_OBJECT(obj);
于 2010-09-08T13:13:38.920 回答
1

map并且stack 后台显式调用delete yourObject,对于“显式”的大多数定义 - 这就是您的删除运算符被调用的原因。这些删除的合法性不亚于您的代码中的删除。

顺便说一句,你如何获得文件名和行号?当心,__FILE__可能__LINE__不会工作。这些将返回它们所在行号的文件名和行号,这意味着您将获得delete方法的位置,而不是调用者的位置。

要获得您想要的行为,只记录“显式”删除和跟踪它们的位置,您需要用宏调用替换要记录的删除。在这种情况下,您不需要覆盖delete. 例如:

#define DELETE(p) \
    do { \
        std::cout << __FILE__ << ":" << __LINE__ << ": " << p << std::endl; \
        delete p; \
    }
于 2010-09-08T13:13:08.340 回答