C++的unique_ptr::release

释放给调用方返回的存储指针的所有权,并将存储的指针值设置为nullptr。

使用 release接管unique_ptr存储的原始指针的所有权。 调用方负责返回的指针的删除。 unique-ptr设置为空的默认构造状态。 在调用到release后,您可以将兼容类型的另一个指针分配到unique_ptr。

实例:

// stl_release_unique.cpp
// Compile by using: cl /W4 /EHsc stl_release_unique.cpp
#include <iostream>
#include <memory>

struct Sample {
   int content_;
   Sample(int content) : content_(content) {
      std::cout << "Constructing Sample(" << content_ << ")" << std::endl;
   }
   ~Sample() {
      std::cout << "Deleting Sample(" << content_ << ")" << std::endl;
   }
};

void ReleaseUniquePointer() {
   // Use make_unique function when possible.  
   auto up1 = std::make_unique<Sample>(3);
   auto up2 = std::make_unique<Sample>(42);
   
   // Take over ownership from the unique_ptr up2 by using release
   auto ptr = up2.release();
   if (up2) {
      // This statement does not execute, because up2 is empty.
      std::cout << "up2 is not empty." << std::endl;
   }
   // We are now responsible for deletion of ptr.
   delete ptr;
   // up1 deletes its stored pointer when it goes out of scope.   
}

int main() {
   ReleaseUniquePointer();
}

运行结果:

Constructing Sample(3)
Constructing Sample(42)
Deleting Sample(42)
Deleting Sample(3)

注意一点:

release后被接管的指针ptr,需要自己释放;而原先的up1离开了函数自动释放。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::unique_ptrC++标准库中的一个智能指针类,用于管理动态分配的对象的所有权。它提供了独占式拥有(exclusive ownership)语义,意味着一个unique_ptr实例可以独占地拥有所指向的对象,并在其生命周期结束时自动释放该对象。 使用std::unique_ptr的主要优点是它提供了自动的内存管理,无需手动调用delete来释放对象。当unique_ptr超出其作用域或被重新分配时,它会自动删除所拥有的对象。 以下是std::unique_ptr的一些重要特性和用法: 1. 创建std::unique_ptr对象: ``` std::unique_ptr<int> ptr(new int); ``` 在这个例子中,我们创建了一个指向int类型对象的unique_ptr。 2. 转移所有权: ``` std::unique_ptr<int> ptr1(new int); std::unique_ptr<int> ptr2 = std::move(ptr1); ``` 通过std::move函数,我们可以将ptr1的所有权转移到ptr2中。此时,ptr1将不再拥有对象的所有权,ptr2将成为唯一拥有者。 3. 访问所指向的对象: ``` std::unique_ptr<int> ptr(new int(42)); int value = *ptr; ``` 我们可以通过解引用操作符*来访问unique_ptr所指向的对象。 4. 释放所有权: ``` std::unique_ptr<int> ptr(new int); int* rawPtr = ptr.release(); ``` 调用release函数可以释放unique_ptr对对象的所有权,返回一个指向该对象的裸指针。此时,unique_ptr不再拥有对象的所有权。 5. 重置unique_ptr: ``` std::unique_ptr<int> ptr(new int); ptr.reset(new int); ``` 使用reset函数可以将unique_ptr指向一个新的对象。这将导致原来指向的对象被删除,并将unique_ptr重新指向新对象。 6. 自定义删除器: ``` std::unique_ptr<FILE, decltype(&std::fclose)> filePtr(std::fopen("file.txt", "r"), &std::fclose); ``` unique_ptr允许我们提供一个自定义的删除器函数,以便在释放对象时执行其他操作。在上述示例中,我们使用std::fclose函数作为删除器来关闭打开的文件。 总之,std::unique_ptr提供了一种安全、高效的方式来管理动态分配对象的所有权,并避免了手动内存管理所带来的错误和资源泄漏的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值