std :: move on unique_ptr指向的对象

时间:2015-10-19 03:44:04

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

移动unique_ptr指向的对象而不是uptr本身是否合法?例如std::unique_ptr<Foo> uptr(new Foo()); Foo bar = std::move(*uptr);任何潜在的陷阱?

std::move语义表明在移动时,对象处于有效但未指定的状态。 unique_ptr reset / release仍然安全吗?

我为矢量尝试了这个并且它有效 - https://ideone.com/d1OfUm

int main() {
  std::unique_ptr<std::vector<int> > uptr(new std::vector<int>);

  uptr->push_back(23);
  uptr->push_back(45);
  uptr->push_back(34);

  std::cout << "uptr size = " << uptr->size() << std::endl;
  for (auto i=0; i < uptr->size(); ++i) {
    std::cout << "(*uptr)[" << i << "] = " << (*uptr)[i] << std::endl;
  }
  std::cout << std::endl;

  std::vector<int> v = std::move(*uptr);

  std::cout << "uptr size post move = " << uptr->size() << std::endl;
  for (auto i=0; i < uptr->size(); ++i) {
    std::cout << "(*uptr)[" << i << "] = " << (*uptr)[i] << std::endl;
  }
  std::cout << std::endl;

  std::cout << "moved vec size = " << v.size() << std::endl;
  for (auto i=0; i < v.size(); ++i) {
    std::cout << "v[" << i << "] = " << v[i] << std::endl;
  }
  std::cout << std::endl;

  return 0;
}

1 个答案:

答案 0 :(得分:4)

  

std :: move语义表明在移动时,对象处于有效但未指定的状态。

标准库类也是如此。对于定义良好的用户定义类也应如此。但您确实能够创建自己的类,这些类可以按照您自己的规则进行操作。尽管如此,尽量避免使用它。

  

unique_ptr重置/释放是否仍然安全?

如果对象处于有效状态,则通过unique_ptr或其他方式销毁它是安全的。