2009-08-06 24 views
3

Windows DLLダイナミックライブラリを生成する際に、一部の関数をDLLにプライベートにし、他のアプリケーションからアクセスできないように、エクスポートする関数を宣言するように求められます。Windows DLLライブラリでデストラクタをエクスポートする必要がありますか?

デストラクタをエクスポートする必要があるのか​​、コンパイラやWindowsカーネルが自動的に処理するのかについては何も言及していませんか?私がデストラクタをエクスポートしない場合と、エクスポート可能であると宣言したクラスを動的に割り当てる場合、デストラクタがエクスポートされていない場合、そのクラスに対してdeleteを呼び出すことはできますか?

答えて

6

一般に、コンストラクタを持つクラスであれば、デストラクタもエクスポートする必要があります。

は言われていること、

Windows上で構築している場合は、あなたがライブラリとVSのバージョンを混合について注意する必要があります...物事のカップルがここを警戒するためにあります。あなたのライブラリをDLLとして配布するつもりなら、コンストラクタとデストラクタをエクスポートするのは悪い考えです。問題はC++ランタイムにあります。これは、メモリ割り当てを処理する同じランタイムが解放を処理する必要があることはほぼ必要条件です。これは、たとえばVS 2008内からVS 2005でコンパイルされたライブラリを使用しようとすると発生する「悪いこと」の第1の原因です。

解決策は、クラスを作成するためのファクトリメソッドを提供することです(割り当ては、コンパイルしたランタイムによって処理されます)。クラスを削除/破棄する方法(同じランタイムで割り当てが解除されるように)

+2

ファクトリファンクションのルートに行くと、C++以外のプログラムでDLLが使用される可能性もあります。これは、誰もが良いことだと思うことを望みます。 –

+0

さて、一般的に、デストラクタをエクスポートするのは悪いことです。私は実際にファクタメソッドを作成に使用することを計画していましたので、先に進むかもしれません。また、明快にするために、同じランタイムが割り当てを解除して割り当てるというような悪い点について、もう少し詳しく説明できますか? –

+0

@IQ:VC2005ランタイムがVC2008のランタイムによって割り当てられたものを削除した場合、メモリ破損やクラッシュなどの原因となるバグを(時には追跡が非常に困難です)実行することができます。 –

4

デストラクタが利用できないが、そうでなければならない場合、コンパイラはエラーを生成するはずです。原則として、あなたのコンストラクタがエクスポートされていれば、あなたのデストラクタもそうでなければなりません。