Контейнеры C ++ безопасны для исключений? - PullRequest
1 голос
/ 10 июля 2011

Я использую неявный конструктор и load() член, который вводит атрибуты, но также может выдавать исключения.

Мой вопрос: если атрибуты являются повседневными контейнерами C ++, я получу утечки памяти, если произойдут исключенияв load()?

Спасибо за чтение.

Редактировать: пример кода, чтобы помочь прояснить мой вопрос.

class One
{
public:
    std::vector<int> stuff;

    void load() {
        stuff.resize(13);
        stuff[0] = 43;

        std::bad_alloc ba;
        throw ba; // will this cause memory leaks? (as far as this class is concerned)
    }
}

Я знаю, что это глупый вопрос, но япришлось спросить это.

Ответы [ 3 ]

10 голосов
/ 10 июля 2011

Сам контейнер безопасен для исключений.
Но это также зависит от типа, помещаемого в контейнер, и от того, правильно ли оно было написано.

, т.е.: исключения не должны выходить из деструктора

Стандарт определяет следующие гарантии на контейнеры и исключения:

23.2.1 Общие требования к контейнерам [container.requirements.general]

Пункт 10:

Если не указано иное (см. 23.2.4.1, 23.2.5.1, 23.3.3.4 и 23.3.6.5), все типы контейнеров, определенные в этом разделе, отвечают следующим дополнительным требованиям:
- если исключение выдается вставкой ()Функция при вставке одного элемента, эта функция не имеет никаких эффектов.
- если исключение выдается функцией push_back () или push_front (), эта функция не имеет никаких эффектов.
- нет erase (), clear (), функция pop_back () или pop_front () генерирует исключение.
- конструктор копирования или оператор присваивания возвращаемого итератора не генерирует исключениеtion.
- функция swap () не генерирует исключение.

1 голос
/ 10 июля 2011

Да, контейнеры безопасны от исключений.Пока вы не делаете махинации, такие как размещение их в куче (без исключений, безопасных интеллектуальных указателей) или что-то в этом роде, у вас все будет в порядке.

0 голосов
/ 10 июля 2011

Поскольку в вашем вопросе не так много говорится, вот мое мнение.

Если вы выделяете память с помощью new/new[] (внутри вашего load()), то вам нужно освободить ее с помощью delete/delete[], когдагенерируется исключение.

Если вы выделяете в качестве автоматической переменной, они безопасны для исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...