测试新操作员失败

testing new operator fail

本文关键字:失败 操作员 测试      更新时间:2023-10-16

我创建了一个类,其中构造函数中有一些新的运算符。我已经在构造函数中创建了卫士来管理新的操作员失败,但现在我想测试它

例如,我有一个构造函数,它是这样的:

Function::Function()
{
try
{
m_pxArgument = new Argument();
}
catch(std::bad_alloc)
{
throw MemoryException();
}
}

有没有可能创建一个测试,让我告诉新的操作符失败,测试我的catch代码?

如果Argument是你的类/结构,那么在这个类中定义new操作符只是为了UT的目的。

class Argument {
//...
#ifdef UNIT_TEST
static bool& failNew() { static bool failNew = false; return failNew; }
void* operator new(size_t size)
{
if (!failNew())
return ::operator new (size);
failNew() = false;       
throw std::bad_alloc("Argument");
}
#endif
};

只要在每次需要分配失败时设置Argument::failNew() = true;即可。

要进行这样的测试,您需要为class Argument重载operator new,然后提供一个抛出测试用例的定义。但是,由于在运行时无法轻松交换,您可能需要一个单独的测试程序。

如果你是我的C++学生,我会首先问,为什么你会可变地使用new和a可能是"裸"指针成员。第一种选择是创建Argument类型的成员变量,并跳过显式堆分配。如果您在现代代码中确实需要动态分配,我建议您使用shared_ptr<Argument>和函数::Function():m_pxArgument(make_shared()){}

我想问的第二个问题是,为什么要将std::bad_alloc转换为自己的异常类型,以及是否需要在构造函数中进行转换。std::bad_alloc是你实际遇到的情况的标准化例外,如果发生这种情况,生活通常已经够糟糕的了,你的小过程对恢复没有多大作用(参见Charles Weir和James Noble的"Captain Oates"模式)。