Освобождение памяти и исключения - PullRequest
6 голосов
/ 15 августа 2010

У меня вопрос по поводу освобождения памяти и исключений.когда я использую delete для удаления объекта, созданного в куче.Если перед этим удалением происходит исключение, происходит ли утечка памяти или будет выполнено это удаление?

Ответы [ 4 ]

5 голосов
/ 15 августа 2010

В случае, если вы описываете, память будет течь.

Два способа избежать этой проблемы:

  • используйте умные указатели, которые не страдают от той же проблемы (предпочтительное решение)
    -> интеллектуальный указатель создается в стеке, поэтому вызывается его деструктор, несмотря ни на что, а в деструкторе предусмотрено удаление указанного содержимого

  • используйте операторы try / catch, а также удалите элемент из оператора catch

4 голосов
/ 15 августа 2010

Это зависит от того, где находится delete. Если он находится внутри catch, который перехватывает исключение, он может вызвать.

try {
    f();  // throws
} catch( ... ) {
    delete p;  // will delete
}

Если после catch перехватывается исключение и catch не возвращается из функции (т. Е. Позволяет потоку выполнения продолжаться после блока catch), то может вызываться delete.

try {
    f();  // throws
} catch( ... ) {
    // execution proceeds beyond catch
}
delete p;  // will delete

Если delete не находится в блоке catch или после блока catch, который позволяет продолжить выполнение, тогда delete не будет вызывать.

try {
    f();  // throws
    delete p;  // will not delete
}  // ...

Как вы можете себе представить, в двух первых случаях выше delete не будет вызываться, если есть бросок до delete:

try {
    f();  // throws
} catch( ... ) {
    g();  // throws
    delete p;  // will not delete
}
2 голосов
/ 15 августа 2010

Это не будет называться. Вот почему вам рекомендуется взглянуть на RAII. Смотри Страуструп

0 голосов
/ 15 августа 2010

Мы также должны убедиться, что «исключение» действительно означает исключение C ++, которое может быть перехвачено try / catch.В системе есть и другие исключения, которые C ++ try / catch не может перехватить (например, деление на 0).

В таких случаях (за пределами стандартов C ++) также «delete» не будет выполнятьсяесли только эти исключения не перехвачены и обработчик явно не вызовет «delete» соответствующим образом.

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