Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to handle errors with std::vector?

std::vector allocates memory which can fail, but the constructor can't return anything, should we use try and catch every time we declare an std::vector ?

I know this question might have already been answered but I didn't find anything, please comment links.

like image 306
linternetsansfil Avatar asked Dec 18 '25 10:12

linternetsansfil


1 Answers

Yes, the default allocator used in std::vector can throw in critical conditions like "out-of-memory". Unhandled exceptions automatically call std::terminate(), which by itself is a good enough handler for these situations, since they should normally never occur (on modern systems with virtual memory, std::bad_alloc is rarely a sign of insufficient memory, and instead a sign of an error in the program, like trying to allocate a negative amount).

So "do nothing" is a good enough way to handle a potentially throwing std::vector.

On Linux you'd get terminate called after throwing an instance of 'std::bad_alloc', what(): std::bad_alloc, Aborted (core dumped).

Unfortunately there are platforms (e.g. Windows) where std::terminate() prints nothing.

For best portability you can thus catch all std exceptions globally to print some meaningful error message just before exiting. For example:

int main() {
    try {

        // program code ...

    } catch (std::exception const& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
        exit(1);
    }
}

Also don't forget to treat any additional threads, if any, in a similar way.

In any case, an individual try-catch per std::vector instance would be overkill.

like image 85
rustyx Avatar answered Dec 21 '25 02:12

rustyx



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!