C ++,macros在静态成员函数中使用“this”的解决方法

我已经重写了新的,以便我可以跟踪内存分配。 其他参数,如__FILE____FILE__ __LINE__ ,模块名称等被添加到#define

不过,我想将调用对象的地址添加到参数中,以便在查找问题时可以回溯分配。 最简单的方法是添加“this”这些额外的参数(这意味着调用者的地址被传递到我的自定义分配的东西)。

不幸的是,我们的代码中有很多单例,这意味着一堆静态成员函数调用new。 编译器抛出错误C2671: '...' : static member functions do not have 'this' pointers

有没有解决方法,我可以得到的对象的地址,而不使用this ,这也意识到它是在一个静态的方法,并通过null说?

或者也许有一种方法,我的#定义新会识别它是在一个静态的方法,并切换到不同的定义?

重要的是,我不影响现有的项目代码 – 我不想强制开发人员使用像staticnew这样的自定义方法,因为它是静态方法 – 他们应该继续使用新的正常和这种内存跟踪的东西都在后台…

你绝对不能确定一个#define宏是否在静态方法内部。 你甚至不应该使用#define new因为它违反了标准(尽管所有的编译器都支持它)。 你的宏也会给那些想要重载新的操作符的人带来麻烦。

一般来说,我会建议不要使用这种内存调试。 有许多成熟的内存调试器在调试内存错误时可以做更好的工作。 最有名的是Valgrind。

为了给你一个简单的答案 – 在你接近问题的方式中没有一个清晰的解决方案。

那么,一旦你走下了“黑客”的道路,你就可以把可移植性扔出窗外,接近编译器。

你可以把一些内联汇编程序放在你的宏中,调用一个指向__FUNCDNAME__生成的字符串的__FUNCDNAME__ ,如果它看起来像一个成员函数,那么在汇编程序中获得this指针,如果不是,只需使用null。