我创建了一个类似下面的程序
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
指向新字符串?
答案 0 :(得分:1)
您的Encode
函数会传递共享指针的副本。而你只是在修改那个副本。不是主要的那个。
void Encode(shared_ptr<string>str)
您应该通过引用传递指针。然后它将引用到main中的同一shared_ptr
。
void Encode(shared_ptr<string> &str)
作为旁注,调用shared_ptr::get()
通常是一个坏主意,因为它会生成一个原始指针,可以回避智能指针的用途。而不是str.get()
,只需使用*str
。