我對在VC++ 2015中看到的結果感到驚訝,並且需要幫助瞭解它是如何工作的。如何從void *的unique_ptr <T>轉換爲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風格轉換」之前,請理解我正在處理遺留代碼,它通過void指針和結構成員的偏移來處理結構的序列化。我現在無法改變那部分。但是我想爲結構成員使用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