【发布时间】:2011-10-10 22:27:21
【问题描述】:
我决定在我的类中重载 new、new[]、... 运算符,以便记录调用它们的文件和行,以便更轻松地跟踪内存分配/泄漏。
现在问题出在我的堆栈和数组类(以及其他分配内存的模板容器类)中:
如果我将它们与我的一个类一起使用,它有 new,new[],... 运算符重载,它可以正常工作。
但如果我将它与标准 c++ 数据类型(int、float、...)一起使用,我无法分配它们,因为没有重载的 new 运算符与 new(__ LINE __ , __ FILE __) 的参数匹配运算符(或其他类似placement new)。
堆栈代码示例:
// placement new
T* t=new(__ LINE __ , __ FILE__)(&m_data[i])T;
所以我对如何完成这项工作没有好主意。如果我用 new 替换 new(__ LINE __ ,__ FILE __) 我失去了内存记录能力。 一种解决方案是为使用默认 new 的标准数据类型创建一个单独的堆栈。
有什么方法可以在编译时检测模板参数是结构、类还是内置 c++ 类型?
你如何处理这样的事情? 你有什么建议? 任何关于这种设计(好的,坏的)的 cmets 显然都是受欢迎的(只是不要发布诸如“不要用你自己的容器重新发明轮子”之类的东西)。
【问题讨论】:
-
您是否在全局范围内重载
operator new(__LINE__, __FILE__)并尝试与int、float等一起使用? -
一种选择是替换全局
operator new()和朋友。 -
如果你正在寻找内存泄漏调试,我不明白你为什么要为此做一些已经存在的工作:Valgrind?
-
也许this 有帮助?
-
另外,有人可能会问为什么您需要动态分配原始数据类型...也许可以重新设计设计以减少动态存储?
标签: c++ memory new-operator memory-leaks operator-keyword