私はVC++ 2015で見ている結果に驚き、どのように動作するか理解するのに役立つ必要があります。unique_ptr <T>のvoid *からT **へのキャストはどのように機能しますか?
struct MyType
{
MyType(int x_) : x(x_) { }
int x;
};
auto u = std::make_unique<MyType>(10);
void* pv = &u;
u
のアドレスがMyType
へのポインタではありませんので、これは明らかに失敗します。
MyType *pM = (MyType*)pv;
しかし、これは動作しますが、pM2
はu
に保存されているMyType
オブジェクトのアドレスを取得:
MyType** ppM = (MyType**)pv;
MyType* pM2 = *ppM;
を
これは正常に動作するはずのことは、標準規格にはありますか?それとも、私のコンパイラの移植性のない実装の詳細のためだけに動作していますか?何か私はunique_ptr
のような方法でラウンドでポインタへのポインタのように扱うことができますか?
そして、あなたが言う前には、「それは愚かだ、void*
またはCスタイルのキャストを使用していない」、私はメンバーを構造体へのボイドポインタとオフセットを通じて構造体のシリアライズを扱うレガシーコードで働いていることをご了承ください。私は今、その部分を変更することはできません。しかし、構造体メンバにunique_ptr
を使用して、メモリの所有権とクリーンアップを簡素化したいと考えています。そして私はunique_ptr
がこのレガシー環境でどれほど壊れやすいか知っています。
あなたは単に 'MyType * pv = u.get();'をしないのですか? http://en.cppreference.com/w/cpp/memory/unique_ptr/get – Brandon
上記のそれぞれについて、*作品ではどういう意味ですか/うまくいかないのですか?それぞれの場合に 'unique_ptr'が所有するオブジェクトへのポインタを取得しようとしていますか?はいの場合、 'MyType ** 'キャストは何ですか? 'void * pv = u.get();'あなたが使っているステートレス・デリゲーターを持つ 'unique_ptr'は、通常、管理対象オブジェクトへのポインタだけを含んでいるので、タイプ・ペニングが機能するようです。 – Praetorian
'std :: unique_ptr'は単一のポインタ属性を持つ構造体である可能性が高いため、' std :: unique_ptr'型のオブジェクトのアドレスは、最初の属性のアドレスと同じであるため、このオブジェクトはポインタです。 – Holt