Нужно ли экспортировать деструкторы в библиотеки Windows DLL? - PullRequest
3 голосов
/ 06 августа 2009

При создании динамических библиотек DLL для Windows вас просят указать, какие функции следует экспортировать, чтобы некоторые функции могли оставаться частными для DLL и недоступными для других приложений.

Я не видел ничего упомянутого относительно того, нужно ли экспортировать деструкторы, или они автоматически обрабатываются компилятором или ядром Windows? Например, если я не экспортирую деструктор, а они динамически выделяют класс, который я объявил экспортируемым, могут ли они успешно вызвать delete для него, если деструктор не экспортируется?

Ответы [ 2 ]

6 голосов
/ 06 августа 2009

В общем, любой класс с конструктором должен также экспортировать деструктор.

Как говорится, есть несколько вещей, которые нужно с осторожностью относиться ...

Если вы работаете в Windows, вам нужно быть осторожным при смешивании версий VS с библиотеками. Если вы собираетесь распространять свою библиотеку как DLL, экспорт конструкторов и деструкторов - плохая идея. Проблема в среде выполнения C ++. Это в значительной степени требование, чтобы та же самая среда выполнения, которая обрабатывает выделение памяти, должна была обрабатывать освобождение. Это причина № 1 «плохих вещей», которые происходят, когда вы пытаетесь использовать библиотеку, скомпилированную в VS 2005, например, из VS 2008.

Решением для этого является предоставление фабричных методов для создания вашего класса (выделение обрабатывается средой выполнения, с которой вы скомпилировали), а также методов для удаления / уничтожения вашего класса (поэтому освобождение происходит в той же среде выполнения).

4 голосов
/ 06 августа 2009

Компилятор должен выдать ошибку, если деструктор недоступен, но должен быть. Как правило, если ваш конструктор экспортируется, ваш деструктор тоже должен быть.

...