[英]Why dereferencing a unique_ptr won't modify the original object
請看下面的例子,我用了一個獨特的指針和一個原始指針到a
,我的問題是,為什么原始指針工作,但不是唯一的指針? 如果我想使用unique_ptr
或shared_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.