NULL в экземпляре - PullRequest
       3

NULL в экземпляре

7 голосов
/ 12 июня 2011

При написании C ++, давайте предположим следующую строку кода:

Object* obj = new Object(); 

Если эта строка компилируется и не вызывает исключений или каких-либо других видимых проблем во время выполнения, может obj быть NULL сразу после этой строкивыполнены?

Ответы [ 4 ]

14 голосов
/ 12 июня 2011

Нет, obj не может быть NULL.

Если new завершится неудачей, возникнет исключение std::bad_alloc. Если исключение не было выдано, obj гарантированно указывает на полностью инициализированный экземпляр Object.

Существует вариант new, который не вызывает исключение

Object *obj = new(nothrow) Object();

В этом случае obj будет NULL, если new не удастся, и исключение std::bad_alloc не будет выдано (хотя конструктор Object, очевидно, все еще может генерировать исключения).

На некоторых старых компиляторах new может не выдавать исключение и вместо этого возвращать NULL, но это не соответствует стандартам поведения.

Если вы перегружены operator new, он может вести себя по-разному в зависимости от вашей реализации.

4 голосов
/ 12 июня 2011

Нет, ваша точная линия не может так себя вести.obj всегда будет указывать на действительную память, если не выдается никаких исключений.Однако следующая строка вернет 0, если память не может быть выделена:

Object* obj = new (std::nothrow) Object();
3 голосов
/ 12 июня 2011

new бросков std::bad_alloc - распределение не было успешным. Так что вы должны поймать это исключение.
Вы должны использовать nothrow new, если хотите проверять NULL после new.

2 голосов
/ 12 июня 2011

Нет, если только вы не отключили исключения или не перегрузили std::new, чтобы сделать что-то отличное от стандартного (которое выдает std::bad_alloc при сбое).

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

...