推荐答案
// www.javascriptcn.com code example
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructed\n"; }
~MyClass() { std::cout << "MyClass destroyed\n"; }
void doSomething() { std::cout << "Doing something\n"; }
};
int main() {
std::unique_ptr<MyClass> ptr(new MyClass());
ptr->doSomething();
// ptr 会在离开作用域时自动释放内存
return 0;
}本题详细解读
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时,确保不会在多个地方持有对同一对象的引用,否则会导致未定义行为。