Eme*_* Xu 3 c++ pointers smart-pointers
看下面的例子,我使用了一个唯一的指针和一个原始指针a,我的问题是,为什么原始指针工作但不是唯一的指针?如果我想a通过使用unique_ptr或修改字符串作为引用shared_ptr,我该怎么办?
示例程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
before, a: aaa
After, a: aaa
after 2, a: aaaccc
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
结果:
before, *pa: aaa
After, *pa: aaabbb
after 2, *pa: aaabbbccc
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
before, a: aaa
After, a: aaabbb
after 2, a: aaabbbccc
Run Code Online (Sandbox Code Playgroud)