将unigue_ptr作为shared_ptr传递给向量

时间:2018-02-23 13:19:55

标签: c++ shared-ptr unique-ptr

这是一项测试,可以了解有关shared_ptrunique_ptr的更多信息:

#include <string>
#include <memory>
#include <vector>

std::vector<std::shared_ptr<int> > vec_ptr;

int* get()
  {
  for (size_t i = 0; i < 1; ++i)
    {
    vec_ptr.push_back(std::make_unique<int>());
    }
  return vec_ptr.back().get();
  }
int main()
  {
  int obj = 5;
  int* ptr = get();
  ptr = &obj;

  std::cout << *ptr << std::endl;
  std::cout << *vec_ptr[0].get() << std::endl; //expect: 5, but it is 0
  }

显然没有为vec_ptr分配任何内容。有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:2)

似乎你想做:

*ptr = obj;

而不是

ptr = &obj;

前者将整数obj复制到ptr指向的空间。后者(你正在做的)重新指向ptr指向obj

答案 1 :(得分:2)

以下是此计划的内容:

  • vec_ptr包含3个元素,每个元素都为0.
  • obj,值为5.
  • ptr,指向obj

所以程序打印正确的值5和0.如果你想改变其中一个指针的值,那么你应该像这样分配它:

*ptr = obj;

然后,ptr将指向vec_ptr的最后一个元素(由get()返回),其值为5.但是,您的最后一行仍会打印0 ,因为它打印了矢量的第一个元素,而不是最后一个元素。