Linux g ++ new (std :: nothrow) работает

Я использую постоянное значение c ++ std :: nothrow в новом операторе, чтобы избежать исключения при сбое, и вместо этого вернуть ноль.
Но, как я пытался, это, кажется, не работает в моей среде g ++ 4.4.4 на Linux x86_64.

Ниже приведены программа тестирования и результат выполнения:

#include <stdlib.h>

#include <new>
#include <iostream>

class TT {
public:
TT(int size);
~TT();
private:
char * buffer;
};

TT::TT(int size) : buffer(NULL) {
if (size <= 0) {
throw std::bad_alloc();
}

buffer = (char *)malloc(size);
if (buffer == NULL) {
throw std::bad_alloc();
}
}

TT::~TT() {
if (buffer != NULL) {
delete buffer;
}
}

int main(int argc, char * argv[]) {
TT * tt = NULL;
try {
tt = new  TT(0);
} catch (std::bad_alloc& ba) {
std::cout << "tt exception caught" << std::endl;
}

tt = new (std::nothrow) TT(0);
if (tt == NULL) {
std::cout << "tt is null" << std::endl;
}
else {
std::cout << "tt is not null" << std::endl;
}

return 0;
}

Выполнить результат:

$ uname -i
x86_64
$ g++ --version
g++ (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ t.cpp
$ ./a.out
tt exception caught
terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc
Aborted

Из выходного сообщения выдается исключение; но я бы этого не хотел, вместо этого ожидается возврат нулевого указателя.
Кто-нибудь может мне помочь с этим вопросом. Благодарю.

0

Решение

Конечно есть std::bad_alloc выброшены. Ваш собственный код бросает его.

new (std::nothrow) только указывает, что распределитель памяти нового выражения не сгенерирует. Но однажды твой TT объект создается в этой памяти, он все равно может выдать любое исключение, которое ему нравится.

8

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

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

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