在c ++中重载Delete运算符

时间:2010-09-08 13:08:14

标签: c++ operator-overloading delete-operator

在我的代码中,我重载了newdelete运算符以获取文件名和行号。在我的代码中,我使用的是mapstack。当我从地图中删除特定值时,它只是调用我的重载delete函数,但我只希望显式delete语句能够访问我的函数,而不是其他函数。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

如果你只想让你自己的删除调用你的重载,我不会重载删除操作符,而是创建一个自定义方法,如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);

答案 1 :(得分:1)

mapstack 明确调用delete yourObject,对于大多数“显式”定义 - 这就是调用delete运算符的原因。这些删除与您的代码中的删除同等重要。

顺便提一下,如何获取文件名和行号?请注意,__FILE____LINE__可能无效。这些将返回找到的行号的文件名和行号,这意味着您将获得delete方法的位置,而不是来电者的位置。< / p>

要获得所需的行为,只需记录“显式”删除并跟踪其位置,您就需要使用宏调用替换要记录的删除。在这种情况下,您无需覆盖delete。例如:

#define DELETE(p) \
    do { \
        std::cout << __FILE__ << ":" << __LINE__ << ": " << p << std::endl; \
        delete p; \
    }