(std :: no throw) аварийно завершает работу при сбое выделения

У меня есть собственный распределитель памяти написано что-то вроде

void* Object::operator new(std::size_t size, const std::nothrow_t& nothrow_value)
{
void *p = Allocator->malloc(size);
return p;
}

Поскольку стандарт гласит, что я не должен выбрасывать исключение, я не проверяю, было ли распределение успешным или нет. Теперь я высмеиваю объект Allocator, чтобы вызов функции malloc возвращал мне NULL. Я использую этот оператор примерно так:

class TestClass: public Object
{
public : TestClass()
{
}
}
testObject = new (std::nothrow)TestClass();

Здесь происходит сбой, и bt of gdb показывает что-то вроде этого .. Этот указатель неожиданно становится 0x0. кто-нибудь может объяснить мне ..! Если это так, как я могу справиться с этой ситуацией в моем коде.

#0  0x000000000040acd3 in TestClass::TestClass (this=0x0) at TestAllocatable.cpp:72
#1  0x00000000004074ed in TestAllocatableFixture_Positive2_Test::TestBody (this=0x67cdc0) at TestAllocatable.cpp:238
#2  0x0000000000443c98 in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ()
#3  0x000000000043eaf8 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) ()
#4  0x000000000042bab8 in testing::Test::Run (this=0x67cdc0) at ../gtest/src/gtest.cc:2162

-1

Решение

Попробуйте добавить спецификацию исключения в функцию
определение, чтобы сказать компилятору, что это operator new не будет
бросить:

void* Object::operator new( size_t size, std::nothrow_t ) throw();

или если у вас есть C ++ 1:

void* Object::operator new( size_t size, std::nothrow_t) noexcept;

Без указания исключения, компилятор предполагает, что
operator new Функция никогда не вернет нулевой указатель.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]