2013-03-04 19 views
0

智能指針我創建了一個程序像下面指向新的對象

void Encode(shared_ptr<string>str) 
{ 
    shared_ptr<string> n(new string()); 
     //I am creating the string pointed by n here by analyzing the string pointed by str 
    cout<<endl; 
    cout<<str.get()<<" Func "<<str.use_count()<<" "<<n.get()<<" "<<n.use_count()<<endl; 
    str=n; 
    cout<<str.get()<<" Func "<<str.use_count()<<" "<<n.get()<<" "<<n.use_count()<<endl; 
} 

int main() 
{ 
    string s("aaabbbccd"); 
    shared_ptr<string> str(new string(s)); 
    Print(str); 
    cout<<endl; 
    cout<<str.get()<<" Main "<<str.use_count()<<" "<<endl; 
    Encode(str); 
    cout<<str.get()<<" Main "<<str.use_count()<<" "<<endl; 
    cout<<endl; 
    Print(str); 
    _getch(); 
    return 0; 
} 

,因爲我編碼字符串,所以我不想原始字符串我編碼後,我試圖通過寫入行str=n做它認爲這將使str指向我可以在我的主程序中使用的新字符串,但它不正確,因爲我只將原始字符串作爲輸出,而不是修改後的字符串。

我甚至使用.get()函數進行檢查,它似乎只指向原始字符串。

任何人都可以解釋爲什麼它是這樣的,我如何使str指向新的字符串?

回答

1

您的Encode功能通過共享指針的副本。而你只是修改該副本。不是主要的。

void Encode(shared_ptr<string>str) 

而應該通過參考傳遞指針。然後它會參考到主要相同的shared_ptr

void Encode(shared_ptr<string> &str) 

作爲一個側面說明,它通常是一個壞主意,叫shared_ptr::get(),因爲它產生了迴避智能指針的目的原始指針。而不是str.get(),只需使用*str

+0

感謝德魯的信息 – bourne 2013-03-04 00:26:44