是否可以对重载运算符new和delete进行一些限制? 我的重载新文件链接在我的测试程序的不同文件中。
场景是:
if(condition is satisfied)
call overloaded new
else
call the actual new defined in new.h
答案 0 :(得分:3)
始终使用重载的new
/ delete
并检查您的实施情况。
答案 1 :(得分:1)
一旦你更换了默认的::operator new()
,就不能再使用它 - 它已经永远消失了。 See this question
如果您希望获得原始::operator new()
的效果,则必须重新实现它,这不是很难。
答案 2 :(得分:0)
有三种方法可以为操作员提供新的。
替换四个非展示位置默认运算符new中的一个或多个
为默认运算符new提供重载(因此使用附加参数,可以使用placement new语法调用这些参数),
为运营商提供新的班级成员,只会为该班级及其后代调用这些成员。
在后两种情况下,可以使用以下语法调用其中一个更熟知的运算符:
ptr = ::operator new(sz);
ptr = ::operator new[](sz);
ptr = ::operator new(sz, std::nothrow);
ptr = ::operator new[](sz, std::nothrow);
但如果您更换了它们,则会调用您的替代品。 您无法调用已替换的默认运算符(也许您可以通过播放特定于实现的链接器技巧,但这超出了语言的范围)。
关于更换operator new:
答案 3 :(得分:0)
您可以轻松地在重载的新运算符中执行检查。一定要实现新运算符的所有风格(正如AProgrammer已经指出的那样)。
无法调用原始/默认新内容,但自己实现它并不困难。毕竟,new只分配内存,就是这样。因此,您也可以调用malloc,HeapAlloc或系统中的任何内存分配例程,而不是调用原始/默认值new。请务必在执行delete时调用相应的内存释放方法(free,HeapFree,...)。
您没有告诉您要在新的实施中检查哪种情况?如果它是一个“静态”条件(我的意思是:在执行应用程序期间总是给出相同的结果),同样的条件也应该添加到你的删除实现中。
如果条件取决于运行应用程序时的情况和更改,您应该预见一种方法,您可以知道在删除功能中使用哪个删除实现。这方面的一个技巧如下:
在您的新实施中:
在执行删除时: