【问题标题】:Can i get the type of object for which new operator is used inside the overloaded new operator?我可以获取在重载的 new 运算符中使用 new 运算符的对象类型吗?
【发布时间】:2019-03-25 11:49:39
【问题描述】:

我有这个函数重载:

static bool returnNull;    
void* operator new(const std::size_t size, const std::nothrow_t&) noexcept
{
    void* address{ nullptr };
    if (!returnNull)
    {
        address = operator new(size);
    }
    return address;
}

我想做一些类似的东西:

void* operator new(const std::size_t size, const std::nothrow_t&) noexcept
{
    if (typeObject == AnimalClass)
        return nullptr;
    void* address{ nullptr };
    if (!returnNull)
    {
        address = operator new(size);
    }
    return address;
}

因此,我需要此功能来对具有许多新调用的构建器进行单元测试,因此我希望基于应该分配的类来失败特定分配

【问题讨论】:

  • 欢迎来到 StackOverflow。您的代码到底遇到了什么问题?
  • 如果有帮助,您可以定义class-specific new and delete operators
  • 不可能
  • 你为什么想要这些news中的一个?请注意,您是在邀请 std::terminate,而不是捕获 ::new(size_t) 抛出的任何 std::bad_alloc
  • 这可能是一个有趣的问题。不幸的是,我认为该语言对此没有任何规定,因此它正在变成一个 x-y 问题。恕我直言,您应该退后一步,想知道为什么要在该测试中拒绝分配AnimalClass,以及是否可以进行不同的设计。这条路绝对是死路一条。

标签: c++ c++11 types overloading new-operator


【解决方案1】:

您的代码所做的可以通过newAnimalClass 的运算符重载来实现:

class AnimalClass
{
public:

   #ifdef UNIT_TEST
   void* operator new(size_t)
   {
      return nullptr;
   }
   #endif
};

您可以使用#ifdef 预处理器指令将代码保留在测试之外。在包含标题之前定义UNIT_TEST

【讨论】:

  • 是的,但我想测试课程。我不想改变它在测试之外的行为
  • @ArronStowne,考虑预处理器选项,它在类似情况下对我有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多