scdmb
scdmb

Reputation: 15631

Operator new with nothrow option still throws exception

There is such code:

#include <iostream>

int main(){
    for(;;){
        int* ptr = new (std::nothrow) int;
        if(ptr == 0){
            std::cout << 0 << std::endl;
            break;
        }
    }
    std::cin.get();
    return 0;
}

However, this program still throws std::bac_alloc exception, altough new is called with std::nothrow parameter. This program is compiled in Visual C++ 2010. Why the exception is thrown?

Edit:

Using g++ on Windows from mingw, everything works ok.

Upvotes: 7

Views: 2988

Answers (3)

Nemanja Trifunovic
Nemanja Trifunovic

Reputation: 24561

I just ran your sample from VC2010. It is not new(nothrow) that throws, but __security_check_cookie.

Upvotes: 1

RedX
RedX

Reputation: 15175

This explains why it is still throwing and how you can make it not throw. It seems nothrow is just ignored.

If you still want the non-throwing version of new for the C Runtime Library, link your program with nothrownew.obj. However, when you link with nothrownew.obj, new in the Standard C++ Library will no longer function.

I found an quite in depth article about this but it's kinda dated (VC 6) but maybe the problem still persists. BTW VC ignores all throw() specifications of functions.

When Operator new(std::nothrow) Throws an Exception Anyway

Upvotes: -3

MSalters
MSalters

Reputation: 179991

0 has to be formatted as "0". That's going to take a few bytes; I'll bet that's the cause. Put a breakpoint on std::bad_alloc::bad_alloc and you will know for sure.

Upvotes: 7

Related Questions