0

メインexeはdllをロードします。単純な boost::any を返す dll から関数を呼び出します。デストラクタで FreeLibrary アプリがクラッシュした後、boost::any が削除された場合。大丈夫です。しかし、なぜこのコードがr2デストラクタでもクラッシュするのか理解できません.r2はメインで作成され、削除はdllコードを必要としません。FreeLibrary の後に boost::any を保存するにはどうすればよいですか。extern "C"なしで試しました-同じ効果。

コンソールコード:

int _tmain(int argc, _TCHAR* argv[])
{
  any r2;

  HMODULE hmod = LoadLibrary(L"dll");
  typedef any (*dllfunc)(int,int,int);
  dllfunc func = (dllfunc) GetProcAddress(hmod,"Export1");

  { 
    any r = func(1,2,3);
    r2 = r;
  }

  FreeLibrary(hmod);
  return 0;
}

DLL コード:

extern "C" 
{
  DLL_API any Export1(int a,int b, int c)
  {
    return a+b+c;
  }
}

コンパイラ Visual Studio 2005

4

2 に答える 2

1

これは、実際に何があるかによって異なりanyます。たとえばshared_ptr、デストラクタ コードが DLL に存在するのに対し、デストラクタを持つオブジェクトの場合があります。any次に、 DLL をアンロードする前に、 のすべてのインスタンスを破棄する必要があります。

于 2012-02-06T13:15:25.043 に答える
0

メモリマネージャがnullポインタを処理しないという同じ問題がありました。

于 2013-02-18T22:13:28.077 に答える