在我的代码中,我重载了new
anddelete
运算符来获取文件名和行号。在我的代码中,我使用map
and stack
。当我从映射中删除特定值时,它只是调用我的重载delete
函数,但我只希望显式delete
语句能够访问我的函数,而不是其他函数。我怎样才能做到这一点?
问问题
1759 次
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 回答