首页 > 其他分享 >[Lang] 智能指针

[Lang] 智能指针

时间:2024-08-13 23:07:37浏览次数:9  
标签:Lang std ptr1 智能 shared unique ptr 指针

[Lang] 智能指针

智能指针能够有效简化内存管理,避免内存泄漏和悬挂指针等问题。

1. std::unique_ptr

  • 独占所有权:一个 std::unique_ptr 对象拥有其管理的对象的唯一所有权。
  • 不允许复制:不能进行复制操作,尝试复制会导致编译错误。
  • 允许移动:可以将 std::unique_ptr 对象移动到另一个 std::unique_ptr,这会转移所有权。
  • 自动释放内存:当 std::unique_ptr 超出作用域时,它会自动释放所管理的对象。
#include <memory>
#include <iostream>
using namespace std;

int main() {
    unique_ptr<int> ptr1 = make_unique<int>(10); // 使用make_unique初始化智能指针

    unique_ptr<int> ptr2 = move(ptr1); // 使用move转移所有权
    if (!ptr1) {
        cout << "ptr1 is null" << endl; 
    }
    cout << *ptr2 << endl; 

    // 自动释放ptr2指向的对象
    return 0;
}
[Running] cd "d:\CppDev\Lang\smart_pointer\" && g++ test1.cpp -o test1 && "d:\CppDev\Lang\smart_pointer\"test1
ptr1 is null
10

[Done] exited with code=0 in 0.902 seconds

2. std::shared_ptr

  • 共享所有权:多个 std::shared_ptr 可以共同拥有一个对象。
  • 引用计数:内部维护一个引用计数,跟踪多少 std::shared_ptr 对象指向同一个对象。
  • 自动释放:当最后一个指向对象的 std::shared_ptr 被销毁时,所管理的对象才会被释放。
#include <memory>
#include <iostream>
using namespace std;

int main() {
    shared_ptr<int> ptr1 = make_shared<int>(20); //使用make_shared初始化智能指针 

    shared_ptr<int> ptr2 = ptr1; // 共享所有权
    cout << *ptr2 << endl; 
    cout << "Use count: " << ptr2.use_count() << endl; // 使用use_count()查看引用计数

    ptr1.reset(); // 释放ptr1
    cout << *ptr2 << endl; 
    cout << "Use count: " << ptr2.use_count() << endl;

    // 自动释放ptr2指向的对象
    return 0;
}
[Running] cd "d:\CppDev\Lang\smart_pointer\" && g++ test2.cpp -o test2 && "d:\CppDev\Lang\smart_pointer\"test2
20
Use count: 2
20
Use count: 1

[Done] exited with code=0 in 0.977 seconds

标签:Lang,std,ptr1,智能,shared,unique,ptr,指针
From: https://www.cnblogs.com/yaoguyuan/p/18357889

相关文章

  • 长度最小的子数组 滑动窗口法(双指针) 解决
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target=7,nums=[2,3,1,2,4,3]......
  • M3KE: A Massive Multi-Level Multi-Subject Knowledge Evaluation Benchmark for Chi
    文章目录题目摘要简介相关工作M3KE实验结论题目M3KE:面向中文大型语言模型的海量多层次多学科知识评估基准论文地址:https://arxiv.org/abs/2305.10263项目地址:https://github.com/tjunlp-lab/M3KE摘要    大型语言模型最近在跨任务泛化、指令跟随等多个......
  • C语言——指针(数组,函数)
    通过指针引用数组数组元素的指针数组指针:数组中的第一个元素的地址,也就是数组的首地址指针数组:用来存放数组元素地址的数组(存放数组元素指针的变量),称之为指针数组。eg://定义一个一维数组inta[]={1,4,9};//使用指针变量存储数组的第一个元素的首地址,也就是数组......
  • 人工智能时代,程序员如何保持核心竞争力?
    人工智能对传统编程行业的影响人工智能(AI)对传统编程行业的影响是多方面的,既带来了机遇也带来了挑战。以下是根据搜索结果总结的几个关键点:提高开发效率:AI可以通过自动化完成代码编写、测试和调试等重复性任务,大幅提高软件开发的效率。这不仅减少了开发周期,还使得程序员有更......
  • Golang - goto语句
    用途可以无条件地转移到过程中指定的行。该语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能,但在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。语法gotolabel;...label:statement;注意:作用域......
  • golang 管道channel相关问题
    一funcmain(){ c1:=make(chanany) <-c1}上面代码运行肯定会报deadlock的死锁错误,但是下面这样,如果有一个协程一直在运行,则不会报错,大致就是因为协程还在运行,所属主协程main不确定是否会往管道c1中写数据,所以就会一直阻塞在这里,上面的代码块或者没有一直执行的协程......
  • 【自用10.2】C++结构体-指向结构体的指针&使用结构体传递值
    指向结构体的指针#include<stdio.h>#include<stdlib.h>#include<string.h>struct_friend{charname[32];charsex;//m-男f-女intage;};intmain(void){struct_friendgirl={"小珑",'f',18};stru......
  • 【人工智能】 使用线性回归预测波士顿房价 paddlepaddle 框架 飞桨
    一、简要介绍经典的线性回归模型主要用来预测一些存在着线性关系的数据集。回归模型可以理解为:存在一个点集,用一条曲线去拟合它分布的过程。如果拟合曲线是一条直线,则称为线性回归。如果是一条二次曲线,则被称为二次回归。线性回归是回归模型中最简单的一种。本示例简要介......
  • C/C++指针无关联,因为它指向已销毁的实例
    一、概述在使用Qt+OpenCV做项目的过程中,发现一个问题。指针无关联,因为它指向已销毁的实例产生这个问题的代码如下:constchar*GLSquareWindow::readFileToString(QStringresPath){QFilevertexShaderFile(resPath);if(!vertexShaderFile.open(QIODev......
  • Langton's Ant
    Avirtualantlivesonaninfiniteboard,dividedintosquarecells.Each cellcanbeeitherblackorwhite.Forstarters,wecanconsideranempty(all-white)boardwithanantresidinginitsarbitrarylocation.Theantoperates accordingtothefollowi......