アプリケーション/ライブラリの境界の一方の側にメモリを割り当て、もう一方の側でメモリを解放している可能性があります。それを正しく行うのは難しく、おそらく避けるのが最善です。
メモリが割り当てられたのとまったく同じアロケータに返されることを確認する必要があります。この問題を回避するためのいくつかのパターンを次に示します。
返された構造にメモリを割り当てるライブラリの代わりに、アプリケーションにそれを行わせます。次に、アプリケーションは構造を解放できます。
ライブラリに構造体にメモリを割り当てさせますが、アプリケーションがそれを解放する代わりに、アプリケーションに特別な解放関数を呼び出させます。したがって、割り当てられた構造を返すライブラリに「getFoo」関数がある場合は、その構造を解放する「freeFoo」関数があります。これにより、ライブラリが構造を独自のアロケータに返すことが保証されます。
ライブラリへの特定の次の呼び出しまで有効な静的に割り当てられた構造をライブラリに使用させます。
ライブラリに「setAlloctor」関数を指定し、アプリケーションmalloc
との間でポインタを渡しfree
ます。このように、ライブラリは常にアプリケーションのアロケータを使用します。
ライブラリが使用している関数とgetAllocator
へのポインタを返す関数をライブラリに与えます。このようにして、アプリケーションはライブラリのアロケータからメモリを取得したり(ライブラリが解放する可能性があるため)、メモリをライブラリのアロケータ(ライブラリが割り当てたもの)に戻したりすることができます。malloc
free
アサーションを生成しているコードを見て、これらのパターンの1つを使用するように変更できるかどうかを確認してください。たとえば、delete
ライブラリが提供する特別なデストラクタ関数を使用する必要があるときに、ライブラリから取得したオブジェクトへのポインタを呼び出しているだけである可能性があります。