hhb*_*lly 10 c++ unique-ptr c++11
对于std::unique_ptrs p1和p2,std::move()和之间有什么区别std::unique_ptr::reset()?
p1 = std::move(p2);
p1.reset(p2.release());
Run Code Online (Sandbox Code Playgroud)
Jon*_*ely 17
从[unique.ptr.single.assign]/2中标准的移动分配规范中可以明显看出答案:
效果:将所有权转移
u到*this好像通过调用reset(u.release())后跟一个赋值std::forward<D>(u.get_deleter()).
显然移动分配不一样,reset(u.release())因为它做了额外的事情.
附加效果很重要,如果没有它,您可以使用自定义删除器获得未定义的行为:
#include <cstdlib>
#include <memory>
struct deleter
{
bool use_free;
template<typename T>
void operator()(T* p) const
{
if (use_free)
{
p->~T();
std::free(p);
}
else
delete p;
}
};
int main()
{
std::unique_ptr<int, deleter> p1((int*)std::malloc(sizeof(int)), deleter{true});
std::unique_ptr<int, deleter> p2;
std::unique_ptr<int, deleter> p3;
p2 = std::move(p1); // OK
p3.reset(p2.release()); // UNDEFINED BEHAVIOUR!
}
Run Code Online (Sandbox Code Playgroud)
例如,第一个能够警告您是否存在析构函数不匹配.另外,这release()是一个非常危险的功能,你的琐碎的例子是正确的,但许多其他用途不是.最好永远不要使用这个功能.
| 归档时间: |
|
| 查看次数: |
5228 次 |
| 最近记录: |