我已经覆盖了新内容,以便我可以跟踪内存分配。 __FILE__
中添加了__LINE__
,#define
,模块名称等其他参数。
但是我想将调用对象的地址添加到参数中,这样我就可以在追踪问题时回溯分配。最简单的方法是将“this”添加到这些附加参数(这意味着调用者的地址被传递到我的自定义alloc内容中)。
不幸的是,我们的代码中有很多单例,这意味着一堆静态成员函数调用new。编译器抛出错误C2671: '...' : static member functions do not have 'this' pointers
是否有一种解决方法,我可以在不使用this
的情况下获取对象的地址,这也可以实现它在静态方法中并传递null说?
或许有一种方法可以让我的#define
new会在静态方法中识别它并转换到不同的定义?
重要的是,我不会影响现有的项目代码 - 我不想强迫开发人员使用像staticnew这样的自定义方法,因为它是静态方法 - 他们应该继续使用像普通的新方法这样记忆追踪的东西都在后台进行......
答案 0 :(得分:5)
您无法确定#define
宏是否在静态方法中。您甚至不应该使用#define new
,因为它违反了标准(即使所有编译器都支持它)。你的宏也会给那些想要为他们的班级重载new new的人带来麻烦。
一般来说,我建议不要使用这种内存调试。有许多成熟的内存调试器在调试内存错误时可以做得更好。最着名的是Valgrind。
为您的问题提供简单的答案 - 您解决问题的方式没有干净的解决方案。
答案 1 :(得分:0)
好吧,一旦你走下“黑客”路径,就可以将可移植性抛到窗外并接近编译器。
您可以在宏中调用一个内联汇编程序,该函数调用一个函数,该函数带有指向__FUNCDNAME__
生成的字符串的指针,如果它看起来像成员函数,则在汇编程序中获取this
指针,如果不是只使用null。