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

标签 c++ smart-pointers

假设我有以下代码:

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/

相关文章:

c++ - 将固定长度的字符数组分配给字符串

c++ - C++中的静态虚函数

rust - 是否存在具有单个强所有者和多个弱引用的共享指针?

c++ - 在 shared_ptr 中使用 deallocator & allocator

C++ - 智能指针 - 在模板内转换智能指针

c++ - 通过函数传递引用安全吗?

c++ - boost::lexical_cast 输出错误

c++ - 迭代器的运算符 * 可以按值返回吗?

c++ - 这是否提供自动内存管理以及内存控制? shared_ptr<unique_ptr<数据>>?

c++ - 在不要求多态类具有虚拟析构函数的情况下,如何实现 shared_ptr (如果是的话)?