解除引用unique_ptr的原因不会修改原始对象

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)

son*_*yao 5

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)

生活


Leo*_*eon 4

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)