Память становится выпущенной, когда я выдаю исключение?

Вы могли бы хотеть проверить это учебное руководство: http://www.webdesignerwall.com/tutorials/css-decorative-gallery/

В нем писатель использует пустой элемент промежутка для добавления накладывающего изображения. Можно использовать jQuery для введения, сказал, что элементы промежутка, если требуется сохранить код максимально чистым. Пример также дан в вышеупомянутой статье.

Hope это помогает!

-Dave

7
задан Azeem 4 September 2018 в 04:54
поделиться

4 ответа

Вызов

new B();

решает две задачи:

  • выделение с помощью оператора new () (глобального или специфичного для класса, возможно, размещения с синтаксисом new (xxx) B () )
  • вызов конструктора.

Если конструктор throw, вызывается соответствующий оператор delete. Случай, когда соответствующее удаление является оператором размещения, является единственным случаем, когда оператор удаления размещения вызывается без синтаксиса :: operator delete (). delete x; или delete [] x; не вызывают операторы удаления размещения, и нет синтаксиса, аналогичного размещению new для их вызова.

Обратите внимание, что в то время как деструктор of B будет не называться, уже созданные подобъекты (члены или B и базовые классы B) будут уничтожены до вызова оператора delete. Не вызываемый конструктор - это конструктор для B.

10
ответ дан 6 December 2019 в 10:02
поделиться

Когда создается исключение из конструктора, память, выделенная с помощью new, освобождается, но деструктор класса B не вызывается.

6
ответ дан 6 December 2019 в 10:02
поделиться

В этом случае ваш объект o фактически не создается, а память, выделенная new, освобождается. Таким образом, деструктор не вызывается. Таким образом, вам НЕ нужно вызывать:

delete o;

Интересный шаблон проектирования - RAII - Resource Acquisition Is Initialization. В этом шаблоне вы используете конструктор, чтобы инкапсулировать получение ресурса и освободить ресурс в деструкторе. Если ресурс не может быть получен, вы добавляете конструктор - как в вашем примере. Таким образом, если у вас есть действительный объект, у вас есть ресурс.

Если объект построен, значит, вы успешно получили ресурс. Это означает, что в течение всего срока службы объекта ресурс принадлежит вам. Когда объект удаляется, ресурс освобождается. Если объект никогда не создается, значит, вы никогда не получали ресурс. См. Википедию:

http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

2
ответ дан 6 December 2019 в 10:02
поделиться

Из стандарта C ++ 2003 5.3.4 / 17 - Новое:

Если какая-либо часть описанной выше инициализации объекта завершается выдачей исключения и может быть найдена подходящая функция освобождения, вызывается функция освобождения для освобождения памяти, в которой создавался объект, после чего исключение продолжает распространяться. в контексте нового выражения. Если не удается найти однозначно совпадающую функцию освобождения памяти, распространение исключения не приводит к освобождению памяти объекта. [Примечание: это подходит, когда вызываемая функция распределения не выделяет память; в противном случае это может привести к утечке памяти. ]

Таким образом, утечка может быть, а может и не быть - это зависит от того, удастся ли найти подходящий освободитель (что обычно бывает, если только оператор new / delete не был переопределен). В случае, когда есть подходящий освободитель,

1
ответ дан 6 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: