0

clunk ( http://sourceforge.net/projects/clunk/ ) と呼ばれる小さなサウンド ライブラリをテストしています。そのライブラリをビジュアル スタジオ 11 用に構築し、ビジュアル スタジオ プロジェクトにリンクしました。test.cpp を試すと、msvcr110d.dll によってアサーションがスローされます。

それは私のランタイムライブラリ設定と関係がありますか:それは " Multithreaded-Debug-DLL (/MDd) " ですか? clunk の cmakelist.txt に、次のコード行を追加しました。

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")

ポインターの割り当てに問題があるというメッセージが引き続き表示されます。どうして?

4

1 に答える 1

7

アプリケーション/ライブラリの境界の一方の側にメモリを割り当て、もう一方の側でメモリを解放している可能性があります。それを正しく行うのは難しく、おそらく避けるのが最善です。

メモリが割り当てられたのとまったく同じアロケータに返されることを確認する必要があります。この問題を回避するためのいくつかのパターンを次に示します。

  1. 返された構造にメモリを割り当てるライブラリの代わりに、アプリケーションにそれを行わせます。次に、アプリケーションは構造を解放できます。

  2. ライブラリに構造体にメモリを割り当てさせますが、アプリケーションがそれを解放する代わりに、アプリケーションに特別な解放関数を呼び出させます。したがって、割り当てられた構造を返すライブラリに「getFoo」関数がある場合は、その構造を解放する「freeFoo」関数があります。これにより、ライブラリが構造を独自のアロケータに返すことが保証されます。

  3. ライブラリへの特定の次の呼び出しまで有効な静的に割り当てられた構造をライブラリに使用させます。

  4. ライブラリに「setAlloctor」関数を指定し、アプリケーションmallocとの間でポインタを渡しfreeます。このように、ライブラリは常にアプリケーションのアロケータを使用します。

  5. ライブラリが使用している関数とgetAllocatorへのポインタを返す関数をライブラリに与えます。このようにして、アプリケーションはライブラリのアロケータからメモリを取得したり(ライブラリが解放する可能性があるため)、メモリをライブラリのアロケータ(ライブラリが割り当てたもの)に戻したりすることができます。mallocfree

アサーションを生成しているコードを見て、これらのパターンの1つを使用するように変更できるかどうかを確認してください。たとえば、deleteライブラリが提供する特別なデストラクタ関数を使用する必要があるときに、ライブラリから取得したオブジェクトへのポインタを呼び出しているだけである可能性があります。

于 2013-02-15T11:45:47.587 に答える