Хм. Проверил на простом gcc, для x86:
Код
class test_t
{
public:
test_t()
{
std::cout << "\r\n in constructor";
}
private:
char arr[20];
};
void command_NTEST_handler(char*)
{
test_t * Tmp = new(std::nothrow) test_t;
if(!Tmp)
std::cout << "тра-та-та не удалось";
}
скомпилилось в
Код
0000000000401220 <command_NTEST_handler(char*)>:
401220: 48 83 ec 08 sub $0x8,%rsp
401224: be f0 22 60 00 mov $0x6022f0,%esi
401229: bf 14 00 00 00 mov $0x14,%edi
40122e: e8 4d f9 ff ff callq 400b80 <operator new(unsigned long, std::nothrow_t const&)@plt>
401233: 48 85 c0 test %rax,%rax
401236: 74 20 je 401258 <command_NTEST_handler(char*)+0x38>
401238: ba 11 00 00 00 mov $0x11,%edx
40123d: be 42 18 40 00 mov $0x401842,%esi
401242: bf e0 21 60 00 mov $0x6021e0,%edi
401247: e8 84 f9 ff ff callq 400bd0 <std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, st
Вроде скипается конструктор.
Потом проверил на codesourcery g++ lite:
Код
class test_t
{
public:
test_t()
{
uart << "\r\n in constructor";
}
private:
char arr[20];
};
void command_NTEST_handler(char*)
{
test_t * Tmp = new(std::nothrow) test_t;
if(!Tmp)
uart << "тра-та-та не удалось";
}
Результат:
Код
08000ff4 <command_NTEST_handler(char*)>:
8000ff4: f641 51b0 movw r1, #7600 ; 0x1db0
8000ff8: b510 push {r4, lr}
8000ffa: 2014 movs r0, #20
8000ffc: f6c0 0100 movt r1, #2048 ; 0x800
8001000: f000 f86e bl 80010e0 <operator new(unsigned int, std::nothrow_t const&)>
8001004: b180 cbz r0, 8001028 <command_NTEST_handler(char*)+0x34>
Опять же, вроде есть проверка...
Да, во втором случае используется нестандартный new, может это имеет значение.
Если бы я знал, что такое электричество...