我已经重写了新的,以便我可以跟踪内存分配。 其他参数,如__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。