2016-09-14 118 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」的副本,而您沒有注意到它。

相關問題