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指向新的字符串?

4

1 回答 1

1

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

void Encode(shared_ptr<string>str)

您应该改为通过引用传递指针。然后它将在 main 中引用相同的内容。shared_ptr

void Encode(shared_ptr<string> &str)

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

于 2013-03-04T00:19:41.137 回答