假设我有以下代码:
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() 结束。
最佳答案
您的代码中有未定义的行为。这一行:
return std::make_shared<char*>(hello);
将 hello 赋给你要返回的共享指针,但这是一个本地数组,返回后不存在。 此外,shared_ptr 将在其引用计数达到零(这是另一个 UB)后删除该指针。
最简单的解决方案是使用 std::string:
std::shared_ptr<std::string> getString()
{
char hello[] = {'h','e','l','l','o', '\0'};
return std::make_shared<std::string>(hello);
}
关于c++ - 无法迭代存储在智能指针中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43940885/