简体   繁体   中英

Exceptions when allocating memory

I've just learnt than you could throw or handle exceptions if memory allocation wasn't successful. But on here, I haven't seen many people handle exceptions when using new operator .

For example: Isn't the following likely to fail at any point in program?

char* c = new char[1000];
delete []c;

And how should you handle exceptions if any?

new throws the exception std::bad_alloc you should catch it by using, try-catch block:

try
{
    char* c = new char[1000];
}
catch(std::bad_alloc &except)
{

}

The basic guideline I follow with exceptions is:
Handle the exception when you can and if you can recover from the exception, take the necessary actions to recover from it, if you can't then you just terminate the application/program by logging appropriate diagnostic.

In cases of an memory allocation failure, an application/program cannot usually continue or recover, So exit by logging some diagnostic message or just let it crash by allowing the exception to propagate upwards.

The reason most people don't handle a bad_alloc exception explicitly is because most of the time there isn't a lot most user applications can do to recover from low memory conditions so letting the exception propogate outwards is the most sensible thing to do. You should only explicitly catch an exception if there is a sensible recovery action that you can perform.

In some cases it can make sense to catch a std::bad_alloc exception, for example if the program can attempt an alternative approach when allocating a large block of memory fails. This only applies in some systems; in a system that overcommits memory, speculatively allocating a large block of memory and expecting a std::bad_alloc will fail.

Explicitly catching a bad_alloc in order to do clean up is usually a sign that resources aren't being managed by appropriate instances of RAII-style classes that should doing the correct clean up in a destructor ensuring that it happens whenever a scope is left, whether by any exception or in some other way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM