智能指针指向新对象

时间:2013-03-04 00:13:58

标签: c++ pointers shared-ptr

我创建了一个类似下面的程序

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 个答案:

答案 0 :(得分:1)

您的Encode函数会传递共享指针的副本。而你只是在修改那个副本。不是主要的那个。

void Encode(shared_ptr<string>str)

您应该通过引用传递指针。然后它将引用到main中的同一shared_ptr

void Encode(shared_ptr<string> &str)

作为旁注,调用shared_ptr::get()通常是一个坏主意,因为它会生成一个原始指针,可以回避智能指针的用途。而不是str.get(),只需使用*str

相关问题