首页 > 编程语言 >C++(std::unique_ptr)

C++(std::unique_ptr)

时间:2023-12-11 16:55:12浏览次数:34  
标签:std uniqueInt 动态分配 拥有权 unique ptr

std::unique_ptr 是 C++ 标准库中的一种智能指针,用于管理动态分配的内存。它是一种独占拥有权(exclusive ownership)的智能指针,保证同一时刻只有一个 std::unique_ptr 指向特定的资源。当 std::unique_ptr 被销毁时,它所拥有的资源也会被释放。

以下是 std::unique_ptr 的基本用法和一些注意事项:

基本用法:

#include <iostream>
#include <memory>

int main() {
    // 使用 std::make_unique 创建 std::unique_ptr,拥有一个动态分配的整数
    std::unique_ptr<int> uniqueInt = std::make_unique<int>(42);

    // 使用指针操作内存
    std::cout << "Value: " << *uniqueInt << std::endl;

    // uniqueInt 指针拥有独占权,不能直接赋值给其他 unique_ptr
    // std::unique_ptr<int> anotherUniqueInt = uniqueInt;  // 编译错误

    // 通过 std::move 转移所有权
    std::unique_ptr<int> anotherUniqueInt = std::move(uniqueInt);

    // uniqueInt 现在为空,不再拥有资源
    if (!uniqueInt) {
        std::cout << "uniqueInt is null" << std::endl;
    }

    // anotherUniqueInt 持有资源
    std::cout << "Value: " << *anotherUniqueInt << std::endl;

    // 在块的末尾,anotherUniqueInt 被销毁,其拥有的资源也被释放

    return 0;
}

注意事项和特性:

  1. 独占拥有权: std::unique_ptr 保证同一时刻只有一个指针拥有资源,这避免了共享指针的引用计数和可能的资源竞争。
  2. 移动语义: std::unique_ptr 支持移动语义,通过 std::move 可以转移拥有权。这使得在函数调用中传递 std::unique_ptr 更高效。
  3. 不能直接复制: std::unique_ptr 不能直接进行复制,因为它是独占拥有权的。要进行所有权的转移,需要使用 std::move
  4. 自动释放资源:std::unique_ptr 超出作用域时,它所拥有的资源会被自动释放。这避免了显式的 delete 操作。
  5. 不适合共享所有权: 如果需要共享所有权,应该使用 std::shared_ptr
  6. 适用于动态分配数组: std::unique_ptr 也可用于动态分配数组。例如,std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);

在现代 C++ 中,推荐使用 std::unique_ptr 来管理动态分配的内存,以提高代码的安全性和可读性。

标签:std,uniqueInt,动态分配,拥有权,unique,ptr
From: https://www.cnblogs.com/keye/p/17894804.html

相关文章

  • std::move
    在使用std::move时,有几个重要的注意事项:std::move并不会真正地移动对象,真正的移动操作是在移动构造函数、移动赋值函数等完成的,std::move只是将参数转换为右值引用1。std::move将一个左值强制转化为右值引用,以用于移动语义。移动语义,允许直接转移对象的资产和属性的所有......
  • C++(std::shared_ptr)
    std::shared_ptr是C++标准库中的一个智能指针类,用于管理动态分配的内存。它提供了一种共享拥有权(sharedownership)的机制,通过引用计数来跟踪指向同一块内存的所有std::shared_ptr实例。当最后一个std::shared_ptr被销毁时,它会自动释放所拥有的内存。基本用法:#include<me......
  • CString CStdioFile
    以下便是MFCCON.CPP內容:#0001//File:MFCCON.CPP#0002//Author:J.J.Hou/TopStudio#0003//Date:1997.04.06#0004//Goal:Fibonaccisequencee,lessthan100#0005//Build:cl/MTmfccon.cpp(/MTmeansMultithreading)#0006#0007#include<afx.......
  • 使用 std::string_view 提升字符串处理性能
    C++标准库提供了一个非常优秀的字符串处理类std::string,我们可以通过该类完成各种字符串操作。但是std::string有一个缺点,它的很多操作都是针对字符串实体,存在不必要的内存拷贝的代码,导致字符串的处理性能不尽如人意。针对这种情况C++17标准引入了std::string_view这个类,该类不会......
  • Maven无法下载fastdfs-client-java依赖问题解决
    一、分析原因控制台报错具体如下:并且pom.xml中以下依赖爆红:<dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version></dependency>原因:因为fastdfs-clien......
  • unique_ptr 和 shared_ptr
    unique_ptr和shared_ptr是C++标准库中的智能指针,用于管理动态分配的对象的生命周期,以避免内存泄漏和手动资源管理的问题。unique_ptr:std::unique_ptr是一个独占所有权的智能指针,确保在任何时候只有一个unique_ptr拥有对动态分配的对象的所有权。当unique_ptr被销......
  • std::io::Error, thiserror和anyhow
    std::io::Error,thiserror和anyhow读到一篇非常好的文章baoyachi大佬的<细说Rust错误处理>从Rust中怎么处理错误,讲到怎么定义自己的错误类型,再到如何简化错误处理流程,再到如何统一错误处理的形式.但是这些都是基于标准库提供功能实现的,需要手动写一些模板代码来完成这......
  • Linux FastDFS 更换服务器数据迁移的方法
    FastDFS是一个开源的高性能分布式文件系统,特别适合于大规模数据和访问量场景。使用FastDFS进行文件存储时,某些情况下,我们可能需要更换服务器,但服务器已经使用一段时间,这时需要将原服务上存储的文件数据进行迁移。本文主要介绍FastDFS中存储的文件进行数据迁移的方法。FastDFS......
  • nullptr关键字
    文章参考:爱编程的大丙(subingwen.cn)C使用NULL表示空,其定义为:#defineNULL((void*)0)在C++中同样定义了NULL,C和C++虽然都是强类型语言,但是C++对语言的要求更高,不允许(void*)类型进行隐式的类型转化,因此如果沿袭C中NULL的定义,那么下述代码会出错:int*p=NULL;因此C++......
  • std:forward
    std::forward在C++中的主要用途是实现完美转发。它的主要好处有以下几点:保持值类别:std::forward能够保持函数参数的值类别(即,它是左值还是右值)。这对于保持潜在的移动语义非常重要2。优化性能:在模板函数中,我们通常使用std::forward来转发函数参数,以便在函数内部使用......