如從一個功能輸出,我得到Foo
類型的對象。作爲另一個類的參數,我需要傳遞一個類型爲std::shared_ptr<Foo>
的對象。我如何從原始對象創建共享指針?如何從非指針對象創建一個std :: shared_ptr?
4
A
回答
7
這是很簡單的:
auto val = std::make_shared<Foo>(FuncThatReturnsFoo(...));
基本上,只要堆上分配一個新的Foo
,複製/結果移到了。
5
我不會做,如果我是你。主要是因爲std::shared_ptr
管理內存,而如果您獲取對象作爲返回類型,則會自動管理內存(通常很可能)。
你要麼必須在動態存儲
Foo getObject();
//...
std::shared_ptr<Foo> ptr(new Foo(getObject())); //construct new object in dynamic memory
//using the copy constructor
創建一個新的對象或改變功能的指針返回一個對象,其內存你管理。
Foo getObject();
//becomes
Foo* getObject();
//or, even better
std::shared_ptr<Foo> getObject();
0
你可以做到這一點
std::shared_ptr<Foo> ptr(new Foo(f());
語義上說,它使返回值的副本,但副本構造函數應該被省略。
1
我懷疑你要防止堆分配,否則只是堆分配返回對象的副本,並繼續前進。
您需要防止的是,缺失者實際上會刪除一些東西,需要堆棧照顧這:
// given the signatures
Foo f();
void other(std::shared_ptr<Foo> x);
Foo my_f = f();
std::shared_ptr<Foo> my_fptr{&my_f, [](Foo*) {}};
other(my_fptr);
這是一個真正的代碼味道,雖然。爲什麼一個函數接受一個 shared_ptr
如果不延長生命期?
1
有兩種方法可以做到這一點:
- 在堆上創建一個新的副本,並從一個shared_ptr。
- 讓從它一個shared_ptr用空缺失者。
首先可以通過編寫
auto newPtr = std::make_shared<Foo>(foo);
這工作要做,如果類Foo
是複製施工的。第二件事可以通過
auto newPtr = std::shared_ptr<Foot>(&foo, [](void*){});
在這裏你不創建對象的新副本。但是,只有在foo
超出範圍之後,才能保證指針未被訪問,這只是安全的。否則,你將訪問一個被破壞的對象,你的程序可能會做隨機的東西。
相關問題
- 1. C++的shared_ptr如何刪除指針對象有多個shared_ptr的
- 2. 從原始指針創建shared_ptr
- 3. 從原始指針到std :: shared_ptr的
- 4. 如何創建一個指向對象的指針
- 5. 的std ::對對象指針
- 6. 從此指針創建共享指針
- 7. 創建對象的指針
- 8. 創建一個指向抽象對象的指針向量
- 9. 兩個std :: shared_ptr來自同一個原始指針
- 10. C++:創建一個共享的對象,而不是共享的對象指針
- 11. C++原始指針和std :: shared_ptr的
- 12. 繼承和智能指針(std :: shared_ptr)
- 13. 創建一個非線程安全shared_ptr
- 14. 創建一個雙指針(ptr到ptr)std :: pair與提升
- 15. 創建一個std :: shared_ptr對象並將其返回到R端(Rcpp)
- 16. 如何創建一個指針結構
- 17. 使用std :: shared_ptr對象實例創建boost :: thread
- 18. 如何創建指向另一個列表中的對象的指針列表?
- 19. 如何在Matlab中創建一個指向對象的指針數組?
- 20. 試圖創建一個指向對象內的先前對象的指針
- 21. 在一個循環中創建唯一的對象指針
- 22. 如何將引用傳遞給由std :: shared_ptr管理的指針
- 23. shared_ptr指針
- 24. 如何參考返回一個對象,它是智能指針
- 25. 創建將共享指針作爲參數的對象的共享指針
- 26. 創建一個NSString指針
- 27. 針對非對象類型的C++智能指針?
- 28. 如何將std :: bind一個智能指針返回方法?
- 29. 從創建一個對象
- 30. shared_ptr和這個指針
你可以改變函數返回美孚或功能採取的shared_ptr,或者是他們都來自一些第三方庫的東西? (如果是這樣,也許如果你告訴我們哪一個,我們可以瀏覽文檔並找出其意圖。) –
abarnert
2012-08-16 17:34:14
這就是爲什麼採用'shared_ptr'參數不理想,應該避免。 – 2012-08-16 17:49:37