2013-03-04 21 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