在我的代码中,我重载了new
和delete
运算符以获取文件名和行号。在我的代码中,我使用的是map
和stack
。当我从地图中删除特定值时,它只是调用我的重载delete
函数,但我只希望显式delete
语句能够访问我的函数,而不是其他函数。我怎么能这样做?
答案 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)
map
和stack
明确调用delete yourObject
,对于大多数“显式”定义 - 这就是调用delete运算符的原因。这些删除与您的代码中的删除同等重要。
顺便提一下,如何获取文件名和行号?请注意,__FILE__
和__LINE__
可能无效。这些将返回找到的行号的文件名和行号,这意味着您将获得delete
方法的位置,而不是来电者的位置。< / p>
要获得所需的行为,只需记录“显式”删除并跟踪其位置,您就需要使用宏调用替换要记录的删除。在这种情况下,您无需覆盖delete
。例如:
#define DELETE(p) \
do { \
std::cout << __FILE__ << ":" << __LINE__ << ": " << p << std::endl; \
delete p; \
}