4

Windows で DLL を使用したことがある人なら誰でも言うようにnew、オブジェクトを DLL 境界の片側に配置し、次に反対側に配置するのは悪い考えdeleteです。通常、これを回避するために DLL でファクトリ メソッドを使用して、新規作成/削除を実行するオブジェクト コードが同じオブジェクト ファイル内で発生するようにします。

今日、私はあるオブジェクトから別の DLL で作成されたオブジェクトにstd::move行きたい新しいインターフェイスを設計していました。別のオブジェクトが基になるポインターを所有するようになったため、 が とは異なるオブジェクト コードで発生する可能性がstd::vector<std::wstring>あることを意味する可能性があることに気付いたとき、私はすべてこれを行う準備ができていました。deletenew

これが事実であるかどうか誰でも確認できますか?

4

1 に答える 1

4

一般に、DLLの境界を越える必要があるオブジェクトは、デストラクタ(およびコピーコンストラクタ/割り当て)があまり機能しないオブジェクトだけです。できれば、最大限の安全性のためにPODのみを使用する必要があります(したがって、まったく同じバージョンのまったく同じコンパイラでコンパイルされていなくても、2つのDLLがインターフェイスできるようにします)。

移動で何が起こるかについては、はい、受信側DLLは提供側DLLによって割り当てられたメモリの割り当てを解除します。これは一般的に「良くない」キャンプに分類されます。

安全性を確保したい場合は、受信DLLからメモリを割り当て(および割り当て解除)する特別なアロケータを使用できます。しかし、それは一般的に迷惑です。

于 2012-07-19T18:13:09.273 に答える