为什么取消引用unique_ptr不会修改原始对象

Why dereferencing a unique_ptr won't modify the original object

本文关键字:修改 原始 对象 ptr 取消 引用 unique 为什么      更新时间:2023-10-16

看下面的例子,我使用了一个唯一指针和一个原始指针到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"