ある動的ライブラリで割り当てられたメモリが別のライブラリで削除されると、dll 境界を越えたメモリの割り当てと割り当て解除で示されるように、問題が発生することがよくあります。私の質問は auto_ptr タイプのオブジェクトに関連しています。dll によって提供されるこのタイプのオブジェクトは、dll を使用するプログラムがオブジェクトを自動的に削除するため、非常に注意が必要です。ただし、DLL ライブラリ内の auto_ptr タイプのオブジェクトに対して、一部のメモリ再割り当て操作が発生することがよくあります。したがって、auto_ptr 型のオブジェクトを破棄する関数を記述する必要があります。まず、dll ライブラリ内の auto_ptr タイプのオブジェクトを破棄することの重要性を示す次の例を示します。
.dll ライブラリのヘッダー ファイルは次のとおりです。
dll.h
class __declspec(dllexport) Image
{
public:
Image()
{
mem = NULL;
}
~Image()
{
std::cout<<"Image is being deleted!"<<std::endl;
delete []mem;
mem = NULL;
}
int *mem;
};
typedef std::auto_ptr<Image> ImagePtr;
class __declspec(dllexport) ImageReader
{
public:
void memory_reset(Image &img)
{
img.mem = new int [20*30];
}
};
dll ライブラリを呼び出す実行可能プログラムは次のとおりです。
#include "dll.h"
#include <iostream>
#include <vector>
#include <numeric>
#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
int main()
{
ImagePtr my_img(new Image());
ImageReader bmp_reader;
bmp_reader.memory_reset(*my_img);
return 0;
}
呼び出されたランタイム ライブラリが静的にリンクされている場合 ( Multi-threaded Debug (/MTd)
)、実行可能プログラムの実行時にエラーが発生します。
この問題を解決するには、auto_ptr オブジェクトをライブラリで削除する必要があります。次に疑問が生じます: このタイプのオブジェクトを削除する最善の方法は何ですか? 私が考えることができる方法は、auto_ptr オブジェクトを削除できるグローバル関数を提供することです。
void Fun_destroy_memory(Image &img)
{
img.~Image();
}
したがって、実行可能プログラムは次のようになります。
int main()
{
ImagePtr my_img(new Image());
ImageReader bmp_reader;
bmp_reader.memory_reset(*my_img);
Fun_destroy_memory(*my_img);
return 0;
}
この状況で他の解決策があるかどうかはわかりません。さらに、私がFun_destroy_memory
. どうもありがとう!