簡體   English   中英

我如何處理 shared_ptr ++

[英]How can i handle shared_ptr ++

 int main ()
 {
    shared_ptr<int[]> a(new int[2]);

    a.get()[0] = 5;
    a.get()[1] = 10;

    int* foo = a.get();

    ++foo;

    cout << *foo << endl;

    return 0;
}

正如我所料,輸出是“10”。 但是我使用了常規指針 (int* foo) 如何僅使用 shared_ptr 實現/使用 ++ 運算符。

std::shared_ptr包含兩部分:

  1. 指向簿記的指針。
  2. 一個有效載荷指針,至少應該是有效的。

因此,對於您的指針算術,只需單獨使用相關的shared_ptr設置

shared_ptr<int[]> foo(a, a.get() + 1);

順便說一句,數組shared_ptr支持索引,因此無需為此檢查.get()

此外,只要您保留一個shared_ptr來保持數據的實時性,使用原始指針和引用進行處理就沒有錯(實際上,這是預期的並且更有效)。

沒有別的辦法。

唯一的方法是調用 get 並在從 get 返回的副本中增加它。

我附上一些有用的鏈接:

智能指針 - shared_ptr

cppreference.com - shared_ptr

您嘗試做的事情在語義上毫無意義。 shared_ptr 表達了擁有某物的意圖(在這種情況下是兩個 int 的數組)。 它所做的只是跟蹤所有權。 如果你增加一個shared_ptr,這是否意味着你釋放了第一個int的所有權? 或者這是否意味着您擁有第二個 int 兩次? 無論哪種方式都不是你想要做的。
通常,僅將 unique_ptr/shared_ptr 用於所有權問題。 要直接操作和使用內存,請使用視圖類,例如span 並非所有編譯器都具有此功能,因此可能必須使用GSL 庫或編寫自己的 無論您如何實現它,最好創建一個單獨的對象來查看該對象,但不聲稱擁有它。 如果您可以將數組的長度與指針聯系起來,那就更好了。

暫無
暫無

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

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