gpt4 book ai didi

c++ - 无法迭代存储在智能指针中的数组

转载 作者:行者123 更新时间:2023-11-27 23:54:04 24 4
gpt4 key购买 nike

假设我有以下代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com