2012-07-01 51 views
12
class MyClass { 
public: 
    MyClass(std::weak_ptr<MyClass> parent){} 
} 

我想這樣做:爲什麼我不能投nullptr到了weak_ptr <>

auto newInstance = std::make_shared<MyClass>(nullptr); 

或weak_ptr的參數的默認值是零,如:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr); 

但,我需要的是這樣做:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr)); 

這是爲什麼?

+0

順便說一句,下次還會在你的問題中包含編譯錯誤 – akappa

回答

23

因爲概念上的weak_ptr只能從另一個weak_ptrshared_ptr構建。從原始指針構造它是沒有意義的,不管它是否爲nullptr

你可以使用默認的構造weak_ptrstd::weak_ptr<MyClass>()),您要使用nullptr

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>()); 
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>()); 
+1

'nullptr'具有特殊類型'nullptr_t',所以原始指針不能隱式轉換爲'nullptr_t'。所以我看不到有任何理由禁止'weak_ptr (nullptr)'。 – magras

+0

@magras我多年前寫了這個回答,而且我有點贊同你。從根本上講,弱指針需要關聯到shared_ptr或unassociated是有道理的。標準委員會顯然認爲,nullptr並沒有傳達無關聯和默認構造。 – David

-1

一個弱指針的主要目的通常是知道,可能是由其他代碼被破壞的對象是否仍然存在。一個由普通指針構造的弱指針怎麼可能知道該對象是否仍然存在?你甚至可以想象一種可能的方式嗎?

+4

我可以想象,我想。很容易。 :) – Kos

+0

「弱指針的唯一目的是要知道一個可能被其他代碼破壞的對象是否仍然存在」是一個令人困惑的陳述。我會說這是weak_ptr的設施。智能指針的目的是自動化內存管理。另外還有一些weak_ptr的功能:(1)正如你所說的觀察對象而不影響它的生命時間(2)防止所謂的「保留週期」(當有一圈對象用共享指針互相引用時,對象活着並導致內存泄漏)(3)可以引用返回shared_ptr的指向對象。 –

+1

如何在構造函數中將weak_ptr自動構造爲nullptr時如何?那時候我需要這個功能。 – Andrew

相關問題