我試圖了解唯一指標在現代 C 中的作業方式。
當我查看檔案(cppreference 和其他檔案)時,我能夠理解這unique_ptr將轉移所有權而不是共享它。但是我無法理解為什么unique_ptr在使用傳遞給其建構式的原始指標時表現得很奇怪。
例如:
#include <iostream>
#include <memory>
class foo{
int x;
public:
foo(): x(0) {}
foo(int a): x(a) {}
foo(const foo& f): x(f.x) {}
};
int main(){
foo *ptr = new foo(5);
std::unique_ptr<foo> uptr(ptr);
std::cout << ptr << "\n";
std::cout << uptr.get() << "\n";
return 0;
}
輸出如下:
0x5c7bc80
0x5c7bc80
查詢:
- 原始指標是否被傳遞給復制建構式?復制建構式不是被洗掉了嗎(
=delete)?為什么原始指標列印與相同的地址unique_ptr? - 這是設計缺陷
unique_ptr嗎? - 我該如何克服這個問題?
- 有什么用
std::make_unique()?我嘗試將線路更改std::unique_ptr<foo> uptr(ptr);為std::unique_ptr<foo> uptr(std::make_unique<foo>(*ptr));但沒有任何改變。
uj5u.com熱心網友回復:
原始指標是否被傳遞給復制建構式?
不是復制建構式,不(將另一個unique_ptr作為輸入)。原始指標被傳遞給轉換建構式,在這種情況下特別是這個建構式:
explicit unique_ptr( pointer p ) noexcept;
復制建構式不是被洗掉了嗎(
=delete)?
是的。但是這段代碼沒有呼叫復制建構式。
為什么原始指標列印與 相同的地址
unique_ptr?
因為unique_ptr它只是將輸入指標原樣復制到它自己的內部成員指標中,從而獲得所指向物件的所有權。您正在列印兩個指標的值,它們具有相同的值,因為它們指向記憶體中的同一個物件。
這是設計缺陷
unique_ptr嗎?
不。
我該如何克服這個問題?
什么問題?這里沒有問題。unique_ptr正在按設計運行。
有什么用
std::make_unique()?
為了更有效地分配記憶體,在該記憶體中構造一個物件,并通過一個 new 獲取該記憶體的所有權unique_ptr,所有這些都在一個操作中完成。
我嘗試將線路更改
std::unique_ptr<foo> uptr(ptr);為std::unique_ptr<foo> uptr(std::make_unique<foo>(*ptr));但沒有任何改變。
它應該有。
該運算式std::make_unique<foo>(*ptr)正在創建一個與指向foo的物件分開的新物件。ptr它將取消參考*ptr的物件傳遞給新foo物件的復制建構式。
然后,在運算式std::unique_ptr<foo> uptr(...);中,uptr移動指向新物件unique_ptr的回傳值。所以現在擁有那個物件。make_unique()foouptrfoo
隨后,您的 2 次列印應該輸出不同的值,因為ptr和 uptr are pointing at differentfoo` 物件。
請注意,在這種情況下,您將泄漏指向的foo物件,因為沒有人取得該物件的所有權。所以你有責任手動處理它。ptrunique_ptrdelete
這段代碼:
foo *ptr = new foo(5);
std::unique_ptr<foo> uptr(ptr);
可以改成這樣:
std::unique_ptr<foo> uptr = std::make_unique<foo>(5);
或者:
auto uptr = std::make_unique<foo>(5);
std::make_unique()分配并構造在其模板引數中指定的型別,將輸入引數傳遞給該物件的建構式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535063.html
標籤:C C 11C 14
上一篇:組件在小部件內部的互動性如何?
下一篇:<二>類模板
