重载新的操作员问题

n3X*_*SLO 8 c++ memory memory-leaks new-operator operator-keyword

我决定在我的类中重载new,new [],...运算符,这样我就可以记录它们被调用的文件和行,这样我就可以更轻松地跟踪内存分配/泄漏.

现在问题出在我的堆栈和数组类(以及其他分配内存的模板容器类)中:

如果我将它们与我的一个具有new,new [],...运算符的类一起使用它可以正常工作.

但是如果我将它与标准的c ++数据类型(int,float,...)一起使用,我就无法分配它们,因为没有重载的new运算符匹配new(__ LINE __,__ FILE __)运算符的参数(或者其他人喜欢安置新的).

堆栈代码示例:

// placement new
T* t=new(__ LINE __ , __ FILE__)(&m_data[i])T;
Run Code Online (Sandbox Code Playgroud)

所以我对如何使这项工作有好主意.如果我用新的松散内存记录功能替换new(__ LINE __,__ FILE __).一种解决方案是为标准数据类型创建一个分离的堆栈,其中使用默认的new.

有没有办法在编译时检测模板参数是结构,类还是内置的c ++类型?

你怎么处理这样的东西?你有什么建议?任何关于这种设计的评论(好的,坏的)显然都是受欢迎的(只是不要张贴诸如"不要用自己的容器重新发明轮子"之类的东西).

spr*_*aff 0

struct Int {
    int i;
    Int (int _i) : i(_i) {}
    operator int () const {return i;}
};

#define __LINE_NUMBER__ Int(__LINE__)
Run Code Online (Sandbox Code Playgroud)

使用此宏而不是标准行号宏,重载解析会将Int行号与int其他数字区分开来。

我无法想象这将如何完全解决。int * x = NEW(int,123);你会像这样使用它吗?

顺便说一句,我同意评论者的观点——你可能不必走这条路。超载new是一种黑魔法,通常应该避免。