我正試圖實施一項技術來測試http://www.codeproject.com/Articles/6108/Simulating-Memory-Allocation-Failure-for-Unit-Test中描述的失敗運算符new
。當新操作員失敗時的構造函數調用
這是被測試的樣本代碼:
VArray* arr = new VArray(1U, 3U, true);
我可以做,而不是分配內存new
回報NULL
。在這種情況下,程序應該繼續到下一行(應測試是否爲arr == NULL
),這正是MSVC中的做法。
但是,VArray
的構造函數仍然在GCC中失敗的new
之後調用。並且因爲this
是NULL
,它會在第一次分配給屬性時產生SIGSEGV。這似乎是錯誤的行爲根據C + + 03標準:https://stackoverflow.com/a/11514528/711006
我的實施運營商new
和delete
下面。
unsigned int OperatorPlainNewFailsAfter = UINT_MAX;
void* operator new(const size_t _size) throw()
{
void* result;
if(OperatorPlainNewFailsAfter == 0U)
{
result = NULL;
}
else
{
result = malloc(_size);
OperatorPlainNewFailsAfter--;
}
return result;
}
void operator delete(void* _memory) throw()
{
free(_memory);
}
我想念什麼?
替換'operator new'必須在失敗時拋出'std :: bad_alloc'。返回NULL值違反了合同。「需要的行爲:返回一個非空指針到合適對齊的存儲區(3.7.4),否則拋出一個'bad_alloc'異常。**這個需求綁定到這個函數的替換版本**上。 – 2014-10-20 08:50:56