2016-09-14 87 views
3

请参见下面的示例,我使用了一个唯一指针和一个指向a的原始指针,我的问题是,为什么原始指针可以工作,但不是唯一指针?如果我想通过使用unique_ptrshared_ptr将字符串a修改为参考,我该怎么办?为什么取消引用unique_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; 
} 

输出:

before, a: aaa 
After, a: aaa 
after 2, a: aaaccc 

回答

0

std::unique_ptr必须引用一个动态分配的对象(以便它可以安全地将其删除)。这就是为什么std::make_unique创建一个新的对象。

这将work up to your expectations

#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 
1

由于std::make_unique<string>(a)创建一个全新std::string对象和与a内容对其进行初始化。新的字符串和旧的a没有任何关联。

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; 

结果:

before, *pa: aaa 
After, *pa: aaabbb 
after 2, *pa: aaabbbccc 

LIVE

1

制作独特构造的对象类型T并将其包装在unique_ptr中。您可能实际上正在制作“a”的副本,而您没有注意到它。

相关问题