假设我有以下代码:
std::shared_ptr<char*> getString()
{
char hello[] = {'h','e','l','l','o'};
return std::make_shared<char*>(hello);
}
int main()
{
std::shared_ptr<char*> shared_str = getString();
std::cout<< (*shared_str)<<std::endl;//OK
std::cout<<(*shared_str)<<std::endl;//KO
return 0;
}
我不知道为什么我只是第一次打印,而第二次是错误的。出于同样的原因,我不能迭代这样的智能指针,如下所示:
for(int i = 0; i < 5; i++)
std::cout<<(*shared_str)[i];
因为在这种情况下,只会打印字母'h'。 我对智能指针感到困惑,因为大部分的表达都是关于处理引用对象的生命周期所以我没有找到那么多。
总结:错误发生是因为“hello”数组超出了范围,实际上,make_shared为char *动态分配内存,并在指针“hello”中存储,但是数组本身将作为函数geString()结束。