簡體   English   中英

解除引用unique_ptr的原因不會修改原始對象

[英]Why dereferencing a unique_ptr won't modify the original object

請看下面的例子,我用了一個獨特的指針和一個原始指針到a ,我的問題是,為什么原始指針工作,但不是唯一的指針? 如果我想使用unique_ptrshared_ptr修改字符串a像引用,我該怎么辦?

示例程序:

#include <iostream>
#include <string>
#include <memory>

int main()
{
    using namespace std;
    string a = "aaa";
    auto ptr = std::make_unique<string>(a);
    auto ptr2 = &a;
    cout << "before, a: " << a << endl;
    *ptr += "bbb";
    cout << "After, a: " << a << endl;
    *ptr2 += "ccc";
    cout << "after 2, a: " << a << endl;
}

輸出:

before, a: aaa
After, a: aaa
after 2, a: aaaccc

std::make_unique<string>(a); new一個全新的std::string (從a初始化),稍后由ptr指出。 因此,對象由*ptr += "bbb" ,但它與原始對象a無關。

您可以通過以下演示確認unique_ptr指向的對象已被修改:

string* pa = new string("aaa");
unique_ptr<string> ptr(pa);
auto ptr2 = pa;
cout << "before, *pa: " << *pa << endl;
*ptr += "bbb";
cout << "After, *pa: " << *pa << endl;
*ptr2 += "ccc";
cout << "after 2, *pa: " << *pa << endl;

結果:

before, *pa: aaa
After, *pa: aaabbb
after 2, *pa: aaabbbccc

生活

std::unique_ptr必須引用動態分配的對象(以便最終可以安全地刪除它)。 這就是為什么std::make_unique創建一個新對象的原因。

這將符合您的期望

#include <iostream>
#include <string>
#include <memory>

int main()
{
    using namespace std;
    string* a = new string("aaa");
    std::unique_ptr<string> ptr(a);
    auto ptr2 = a;
    cout << "before, a: " << *a << endl;
    *ptr += "bbb";
    cout << "After, a: " << *a << endl;
    *ptr2 += "ccc";
    cout << "after 2, a: " << *a << endl;
}

輸出:

before, a: aaa
After, a: aaabbb
after 2, a: aaabbbccc

因為std::make_unique<string>(a)創建一個全新std::string對象,並使用的內容對其進行初始化a 新的字符串和老a有彼此沒有任何聯系。

使唯一構造成為T類型的對象,並將其包裝在unique_ptr中。 您可能實際上在沒有注意到它的情況下復制“a”。

暫無
暫無

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

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