Я перехожу из C в С++ 11 и пытаюсь выяснить парадигму управления памятью для программ С++ 11 (или любых современных языков со встроенными исключениями). В частности, у меня есть трещина в разработке игр, где исчерпание памяти - настоящая проблема.
В C я использую для проверки возвращаемого значения malloc; и обычно используют пользовательские распределители.
С С++ я совершенно смущен; хотя мне нравится, как были построены контейнеры STL, позволяющие настраивать распределители. Поскольку контейнеры STL управляют собственной памятью, просто добавление элемента к вектору может вызвать std::bad_alloc
. Как я защищаю такие вещи? Я слышал, что все вызовы бросания в блоках try/catch могут быть чрезмерно дорогими.
Однако, позволяя исключению путешествовать по стоп-косту, можно было бы выполнить кучу функций, которые не выполнялись бы полностью, и приведут к некоему действительно сложному коду. т.е. если A->B->C->D
- это столбец, D
бросает и A
улавливает, то B
, C
и D
могут потенциально создать некоторые странные проблемы, поскольку они не могут нормально завершить выполнение.
Кроме того, аргумент nothrow
, по-видимому, позволяет очень C-подобный код; хотя я теперь не вижу преимущества над простым malloc.
Каковы некоторые лучшие практики для написания безопасного кода на С++, защищающего от проблем с отсутствием памяти?
edit: Соответствующий ответ на progammers.stackexchange, аргументирующий создание дизайна на С++ без исключений. Не уверен, что эти аргументы все еще применяются к 8-го поколения консолей