移动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;
}
答案 0 :(得分:4)
std :: move语义表明在移动时,对象处于有效但未指定的状态。
标准库类也是如此。对于定义良好的用户定义类也应如此。但您确实能够创建自己的类,这些类可以按照您自己的规则进行操作。尽管如此,尽量避免使用它。
unique_ptr重置/释放是否仍然安全?
如果对象处于有效状态,则通过unique_ptr或其他方式销毁它是安全的。