![](/img/trans.png)
[英]arithmetic std::unique_ptr and void* (get position of element by address)
[英]Different address of std::unique_ptr::get and operator&
在下面的示例中使用指針讓我感到困惑,所以我可能誤解了一些東西。 我將嘗試展示我的理解方式和一些偽簡單的例子。
創建名為my_int
的std::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_int
和my_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.