したがって、MSVCRT の静的にリンクされたコピーを含む C++ ライブラリがあります。誰でも私のライブラリをどのバージョンの MSVC ランタイムでも使用できるようにしたいと考えています。この目標を達成するための最良の方法は何ですか?
私はすでに物事がどのように行われるかについてかなり注意を払っています。
- メモリが DLL バリアを通過して解放されることはありません
- ランタイム C++ オブジェクトは、バリア (つまり、ベクター、マップなど) を越えて渡されません。バリアのその側で作成された場合を除きます)。
- バリア間でファイル ハンドルまたはリソース ハンドルが渡されない
それでも、ヒープの破損を引き起こす単純なコードがまだいくつかあります。
ライブラリに次のようなオブジェクトがあります。
class Foos
{
public: //There is an Add method, but it's not used, so not relevant here
DLL_API Foos();
DLL_API ~Foos();
private:
std::map<std::wstring, Foo*> map;
};
Foos::~Foos()
{
// start at the begining and go to the end deleting the data object
for(std::map<std::wstring, Foo*>::iterator it = map.begin(); it != map.end(); it++)
{
delete it->second;
}
map.clear();
}
そして、次のようにアプリケーションから使用します。
void bar() {
Foos list;
}
どこからでもこの関数を呼び出すと、スタックの破損に関するデバッグ警告が表示されます。そして、実際に使い果たした場合、実際にはスタックとセグメンテーション違反が破損します。
私の呼び出し元アプリケーションは、Visual Studio 2012 プラットフォーム ツールでコンパイルされています。ライブラリは、Visual Studio 2010 プラットフォーム ツールを使用してコンパイルされます。
これは絶対にやってはいけないことですか、それとも実際に複数のランタイムを使用するための規則に違反していますか?