目录
unique_ptr不要使用 delete 或 delete[]:
std::unique_ptr:
是 C++ 标准库中的一个智能指针类型,用于管理动态分配的资源,如堆上的对象。std::unique_ptr
拥有其所指向的资源的独占所有权,这意味着同一时间只能有一个 std::unique_ptr
指向该资源。如果需要转移 std::unique_ptr
的所有权,可以使用以下几种方式:
-
移动语义(Move Semantics): 通过移动构造函数和移动赋值操作符,你可以将一个
std::unique_ptr
的所有权转移到另一个。移动操作会使原来的指针变为 null,同时将所有权转移到新的指针上。这是一种高效的方式,因为它只涉及指针的重新指向,而不需要进行资源的拷贝或析构。std::unique_ptr<int> ptr1 = std::make_unique<int>(42); std::unique_ptr<int> ptr2 = std::move(ptr1); // 转移所有权
-
使用
release
函数:std::unique_ptr
提供了release
成员函数,它将指针从std::unique_ptr
中释放,但并不会销毁资源。这可以用来将指针传递给其他代码,同时保留资源的所有权。std::unique_ptr<int> ptr1 = std::make_unique<int>(42); int* rawPtr = ptr1.release(); // 释放所有权但不销毁资源 // 在适当的时候要手动释放资源,以免内存泄漏 delete rawPtr;
-
使用
reset
函数:std::unique_ptr
的reset
成员函数允许你改变它所拥有的资源。它会释放当前资源并接收一个新的资源指针。这也可以用于将所有权转移给另一个std::unique_ptr
。std::unique_ptr<int> ptr1 = std::make_unique<int>(42); std::unique_ptr<int> ptr2 = std::make_unique<int>(99); ptr2.reset(ptr1.release()); // 释放 ptr2 的资源,将 ptr1 的资源转移给 ptr2
需要注意的是,转移所有权后,原来的 std::unique_ptr
将不再拥有资源,不应再次使用它。这些转移所有权的操作能够有效地管理资源的生命周期,避免资源泄漏和重复释放的问题。