dllにベクター(または文字列)がありますが、新しいメンバーをベクターにプッシュしたり、文字列の値を変更したりするなど、参照またはポインターを介して別のdllで変更しても安全ですか?これを行うと、どういうわけかクラッシュが発生することがありますが、その理由はわかりません。
constポインターまたは参照を使用して、別のdllで読み取った場合、それは絶対に安全ですか?
stlportを使用してみませんか?安全ですか?
STL コンテナーを変更したり、新しい要素を削除または追加したりする場合、通常はメモリの割り当て/割り当て解除が必要です。ある DLL に存在するアロケータを使用してメモリを割り当ててから、別の DLL に存在する別のアロケータを使用して別の DLL でメモリの割り当てを解除すると、問題が発生する可能性があります。これはおそらくあなたが経験していることだと思います。
考えられる解決策の 1 つは、STL コンテナーをクラスにカプセル化し、そのクラスの関数を介して STL コンテナーの関数にアクセスすることです。1 つの DLL にクラスを実装し、そのオブジェクト (および STL コンテナー) を操作するときはいつでも、1 つの C++ アロケーターのみを使用するという考え方です。
ある DLL で別の DLL で作成されたオブジェクト (「読み取り専用」アクセスと言うように) を操作する場合const
、C++ アロケーターを使用しないため、安全なはずです。
両方の DLL が同じ STL バリアントを使用している場合、複数の DLL から stl コンテナーにアクセスすることは (読み取りと書き込みの両方で) 安全です。Visual Studio は、リリース バリアントとデバッグ バリアントの 2 つの STL バリアントを提供します (デバッグ モードで有効にするか、_SECURE_SCL を定義することによって有効にします)。これら 2 つのバリアントは互換性がありません。2 つのモードを混在させると (たとえば、1 つの DLL がデバッグ モードでコンパイルされ、もう 1 つがリリース モードでコンパイルされた場合)、原因不明のクラッシュが発生する可能性があります。これは、2 つのバリアント間でコンテナー サイズが異なるためです。
詳細については、 https://connect.microsoft.com/VisualStudio/feedback/details/524141/serious-bug-when-using-secure-scl-0-cを参照してください。