推荐答案
-- -------------------- ---- ------- -------- -------- -------- ---------- ----- ------- - ------- --------- - --------- -- -------- --------------- - ---------- - --------- -- -------- ------------- - ---- ------------- - --------- -- ------ ------------- - -- --- ------ - ------------------------ ------- ----------- ------------------- -- --- -------------- ------ -- -
本题详细解读
unique_ptr 的特点
独占所有权:
unique_ptr
是一种独占所有权的智能指针,意味着同一时间内只能有一个unique_ptr
指向某个对象。当unique_ptr
被销毁或重置时,它所管理的对象也会被自动删除。不可复制:
unique_ptr
不能被复制,只能通过移动语义来转移所有权。这意味着你不能通过赋值操作将一个unique_ptr
赋值给另一个unique_ptr
。自动释放内存:当
unique_ptr
离开其作用域时,它所管理的对象会自动被删除,从而避免了内存泄漏。自定义删除器:
unique_ptr
允许你指定一个自定义的删除器,用于在释放内存时执行特定的操作。
unique_ptr 的用法
创建 unique_ptr:
std::unique_ptr<MyClass> ptr(new MyClass());
访问对象:
ptr->doSomething();
释放所有权:
MyClass* rawPtr = ptr.release();
重置 unique_ptr:
ptr.reset(new MyClass());
移动语义:
std::unique_ptr<MyClass> ptr2 = std::move(ptr);
自定义删除器:
auto deleter = [](MyClass* p) { delete p; }; std::unique_ptr<MyClass, decltype(deleter)> ptr(new MyClass(), deleter);
注意事项
unique_ptr
不能用于数组,除非使用std::unique_ptr<T[]>
。- 使用
unique_ptr
时,确保不会在多个地方持有对同一对象的引用,否则会导致未定义行为。