限制重载new和删除

时间:2011-02-24 12:47:26

标签: c++ overloading new-operator delete-operator

是否可以对重载运算符new和delete进行一些限制? 我的重载新文件链接在我的测试程序的不同文件中。

场景是:

if(condition is satisfied)
   call overloaded new
else
   call the actual new defined in new.h

4 个答案:

答案 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:

  • 你应该将两个运算符new和相应的两个运算符一起删除(或者使用意外指针轻松调用其中一个delete运算符)
  • 你应该将两个运算符new []和相应的两个运算符delete []放在一起(同样的原因)
  • 注意新处理程序的可能性,一些库可以使用它。

答案 3 :(得分:0)

您可以轻松地在重载的新运算符中执行检查。一定要实现新运算符的所有风格(正如AProgrammer已经指出的那样)。

无法调用原始/默认新内容,但自己实现它并不困难。毕竟,new只分配内存,就是这样。因此,您也可以调用malloc,HeapAlloc或系统中的任何内存分配例程,而不是调用原始/默认值new。请务必在执行delete时调用相应的内存释放方法(free,HeapFree,...)。

您没有告诉您要在新的实施中检查哪种情况?如果它是一个“静态”条件(我的意思是:在执行应用程序期间总是给出相同的结果),同样的条件也应该添加到你的删除实现中。

如果条件取决于运行应用程序时的情况和更改,您应该预见一种方法,您可以知道在删除功能中使用哪个删除实现。这方面的一个技巧如下:

在您的新实施中:

  • 分配比请求多8个字节(这必须是8个字节以保持对齐正确)
  • 使用标识填写前8个字节,以便您可以知道使用了哪个底层内存分配函数
  • 将8个字节添加到已分配的指针并返回此

在执行删除时:

  • 减去给你的指针的8个字节
  • 检查在该地点找到的标识(请参阅新标识)以查看应调用哪种基础删除实现