2017-04-06 50 views
1

我希望我的問題沒有發佈在過去(我搜索過,但我想我沒有使用正確的關鍵字,找不到任何東西)。創建shared_ptr而不復制實例

我想知道,有沒有辦法在不復制實例的情況下創建shared_ptr?我的意思是,我看到make_shared重新創建了我們通過的參數。所以我試圖在class Ashared_ptr(this)這樣做,但我不確定它是否按預期工作。

shared_ptr(raw pointer)究竟做了什麼?它只是存儲指針還是使用複製構造函數創建一個新實例並存儲其指針?

謝謝您的回答

+0

見3號[這裏](http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr)關於第二個問題。我不確定你在第一個問題中要求什麼。 – NathanOliver

+2

您可能想了解['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)。 –

+0

'shared_ptr(raw_pointer)'將把'raw_pointer'指向的現有對象的所有權賦予新的'shared_ptr'。當新的'shared_ptr'及其所有副本被銷燬時,它將被刪除。 「this」引用的對象沒有拷貝。 'std :: make_shared (* this)'會產生新的'shared_ptr'擁有的對象的新副本。 –

回答

3

我認爲你是困惑,指針的行爲...也許?很難破譯你所問的。

我會考慮用刺雖然下面的解釋:

std::shared_ptr<int> mySharedPtr(new int(5)); 

創建一個且只有一個int的實例。

int * myPointer = new int(5); 
std::shared_ptr<int> mySharedPtr = myPointer; 

也創建了一個且只有一個int實例。

int * myPointer = new int(5); 
std::shared_ptr<int> mySharedPtrA = myPointer; 
std::shared_ptr<int> mySharedPtrB = mySharedPtrA; 

也創建一個且只有一個int實例。

std::shared_ptr<int> mySharedPtrA = std::make_shared<int>(5); 
std::shared_ptr<int> mySharedPtrB = mySharedPtrA; 

也創建了一個且只有一個int實例。

在所有這些情況下,int的值是5,有一個實例,並且指向int的指針正在傳遞。

int不會被傳遞,指向int的指針是。 int未被複制,指向int的指針正在被複制。

1
A someInstance; 
auto sptr = std::make_shared<A>(someInstance) 

是的,在這種情況下sptr會隨着someInstance新創建的副本(如果A類定義了公共的拷貝構造函數 - 隱性或顯性的)新shared_pointer實例。

std::make_shared(...)是什麼?它「嘗試」根據給定的參數列表匹配正確的構造函數。在這種情況下,你傳遞了'A const &',它將與複製構造函數匹配。

彙總:

  • std::shared_ptr<T>(...)創建從std::shared_ptr

    • 其他的shared_ptr,
    • std::unique_ptr<T>
    • 指針T的
    • (空的shared_ptr)
  • std::make_shared<T>創建std::shared_ptr<T>使用T構造