[英]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.