![]() |
1
9
取消重载时,可以使用pragma指令保存和还原新宏。请参阅[msdn]。( http://msdn.microsoft.com/en-us/library/hsttss76(VS.71).aspx) 为了准确的语法。 例如。
你可以把这些放在头上,例如 开始_new_override.h:
结束新的覆盖.h:
然后
|
![]() |
2
4
重新定义
所有这些文件和行宏在任何地方展开都会导致.rodata和.data节膨胀,其中包含文件字符串和行号,并在每次调用时生成更多的代码。
更好的方法是(如果预先做更多的努力)利用调试信息的存在(例如
重载全局运算符new和运算符delete(数组、nothrow等)的各种组合,使它们在分配和释放内存时存储和释放堆栈信息。 您甚至可以将这些信息存储在一个结构中,如std::map<void*,stackinfo>,只需注意不要记录由映射插入引起的分配(全局锁可能足够用于单线程应用程序,多线程留给读者作为练习)。 由于您正在为任何给定的alloc记录整个堆栈,所以您可以进行一些漂亮的树分析,按“函数和子体”对分配(泄漏或其他)进行分组…如果您从分配时间了解整个堆栈,那么跟踪复杂的泄漏有时会更容易。 |
![]() |
3
4
为什么不将new定义为不同的东西,而重载operator new呢? 在全局命名空间的某个位置添加这些函数定义:
然后,您可以定义自己的新宏,该宏调用非全局版本,并实现全局版本,以便在调用它们时断言或发出警告(以捕获任何滑入的内容)。
如果直接对类调用“new”,则类级重载将按预期工作。如果你想在类上调用my_new,你可以,但是你必须重新定义类中的重载来匹配你的new。 |
![]() |
4
1
尝试
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 5 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 5 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 5 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 5 月前 |