簡體   English   中英

std::unique_ptr::get 和 operator& 的地址不同

[英]Different address of std::unique_ptr::get and operator&

在下面的示例中使用指針讓我感到困惑,所以我可能誤解了一些東西。 我將嘗試展示我的理解方式和一些偽簡單的例子。

創建名為my_intstd::unique_ptr變量確保它不能被復制,並且它的int object 只有一個所有者。 然后我創建一個向量來存儲指針並放置它而不用std::emplace_back()復制。 現在我想檢查向量integers[0]的元素在 memory 中是否與原始元素my_int具有相同的地址。 我認為應該是因為無法復制此元素。

示例代碼:

auto my_int = std::make_unique<int>(1);
std::vector<std::unique_ptr<int>> integers;
integers.emplace_back(my_int.get());

std::cout<< "Value of my_int: " << *my_int << std::endl;
std::cout << "Address of my_int: " << my_int.get() << std::endl;
std::cout << "Also address of my_int: " << &my_int << std::endl;
std::cout << "Also address of my_int: " << &integers[0]<< std::endl;
std::cout << "Also address of my_int: " << integers[0].get()<< std::endl;

測試結果:

Value of my_int: 1
Address of my_int: 0x260fc40
Also address of my_int: 0x65fb58
Also address of my_int: 0x260fe20
Also address of my_int: 0x260fc40

在將 object 放入向量時,我也嘗試使用std::move()但效果相同,地址不同但我不明白為什么。

我的第一個困惑是&my_intmy_int.get()不一樣,第二個困惑是integers[0].get()也不同於&integers[0]

表達式my_int.get()返回指向包含的 integer 的指針,其類型為int*

表達式&my_int返回指向my_int object 本身的指針,類型為std::unique_ptr<int>*

並且integers[0]是與 my_int 不同的my_int 它們恰好包含相同的指針。 這對唯一指針不利:它們將一起嘗試釋放相同的 memory 兩次。 必須使用std::move

auto my_int = std::make_unique<int>(1);
std::vector<std::unique_ptr<int>> integers;
integers.emplace_back(std::move(my_int)); // push_back also works

這樣my_int將被設置為包含nullptr ,並且只有integers[0]將包含指向分配的 memory 的指針。


為了更好地理解my_int (或真正的指針),您可能會想到這樣的事情:

+--------+     +---+
| my_int | --> | 1 |
+--------+     +---+
^              ^
|              |
&my_int        my_int.get()

integers[0].get()&integers[0]也是一樣的。

創建名為 my_int 的 std::unique_ptr 變量可確保它不能被復制,並且它的 int object 只有一個所有者。

只有std::unique_ptr不能被復制。 但是唯一指針不能保證你不會復制它擁有的裸指針。 復制唯一指針擁有的裸指針正是您所做的,這會導致同一資源的兩個“唯一”所有者。 當第二個唯一指針被銷毀時,這將導致未定義的行為。

當您調用std::unique_ptr::get時,唯一指針不會將其所有權釋放給您。 您永遠不應該將不屬於您的指針傳遞給智能指針的構造函數。

要解決此問題,您可以通過 move 將所有權從一個智能指針轉移到另一個智能指針:

integers.emplace_back(std::move(my_int));

地址不同,但我不明白為什么。

唯一的指針變量是一個object,向量的元素是另一個object。 由於它們是單獨的對象,因此它們具有單獨的地址。 即使它們恰好是指向同一個 object 的指針 - integer,它又是另一個 object。 這三個對象對應於您在 output 中看到的三個不同地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM