为什么取消引用unique_ptr不会修改原始对象
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"
相关文章:
- 修改原始protobuf流
- 如何找到修改后的字符串与原始字符串相等的时间
- 有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- Fixed_alpha_shape_3() 会破坏或修改原始三角测量吗?
- 我想知道像素/片段的原始模板值.零还是一个?如果可能的话,以获取哪些特定操作会修改模板值
- 有条件地传递修改后的副本而不是const原始副本变得丑陋
- 当我修改、更改和“删除”原始指针时,是否需要指针副本
- C++修改通过引用传递的类不会更改原始对象
- 打开一个文件,修改每个字符,然后执行反向操作不输出原始文件
- 操作员重载=修改原始对象
- 子向量修改原始向量
- 否定分数但不修改原始部分
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 创建指针的指针并在不修改原始指针的情况下对其进行修改
- [C++传递值]:被调用函数是否可以修改原始变量的内容
- 为什么取消引用unique_ptr不会修改原始对象
- ++和+=运算符不修改原始对象是否"incorrect behaviour"?
- C++ 重载运算符不修改原始对象(通过引用传递)