私は、ダブルポインタを取り込んでメモリを割り当てる従来の時代のコードを使用しています。実際LegacyAllocator機能がLegacyObjポインタのリンクリストを作成したファイルからの読み込み〜100行とミックスされ、そして私がことができると思いますものではありません別の関数で割り当てられたメモリで共有ポインタを使用する
struct LegacyObj
{
int a;
double b;
};
void LegacyAllocator(LegacyObj** ppObj)
{
*ppObj = (LegacyObj*)malloc(sizeof(LegacyObj));
}
void LegacyDeleter(LegacyObj** ppObj)
{
free(*ppObj);
}
:それの短縮例は、このようになります今すぐ書き直してしかし、私は、この関数の使用を少し安全にして、例外& tcから発生するメモリーリークを回避したいと考えています。私が思い描いた最初の解決策は、クラスでラップし、ctor/dtorでレガシー関数を呼び出すことでした。
class RAIIWrapper
{
public:
RAIIWrapper()
:obj{nullptr}
{
::LegacyAllocator(&obj);
}
RAIIWrapper(RAIIWrapper&& that)
: obj{ that.obj}
{
that.obj = nullptr;
}
RAIIWrapper& operator=(RAIIWrapper&& that)
{
RAIIWrapper copy{std::move(that)};
std::swap(obj, copy.obj);
return *this;
}
~RAIIWrapper()
{
::LegacyDeleter(&obj);
}
private:
LegacyObj* obj;
};
しかし、私は好奇心が強い - std::shared_ptr
やstd::unique_ptr
を使用してこれを行う方法はありますか?私は、元のポインタをLegacyAllocatorに渡し続けることなく、解決策を考え出すことができませんでした。
unique_ptr'と 'shared_ptr'はアロケータを取ることはありません'、彼らだけ取ります削除者。ポインタを 'LegacyAllocator(&obj)'で自分自身に割り当て、 'operator()' – David