理解和使用C++中的智能指针

c++11之智能指针(详解) c++11新特性 智能指针 阅读详情

           使用C++一个最大的好处是它的动态性。我们可以使用new ,delete 动态分配内存和释放内存。但是有时候就会出现一些问题,如果我们忘记删除用new创建的对象,将会出现内存泄露,在长期运行的系统中,甚至一个很小的内存泄露将会造成很大的问题。所以,怎么样保证每一个new对应一个delete呢?

          一个很好的办法是用C++中的auto_ptr变量。接下来讲使用智能指针来解决这个问题。 在MyAuto_Ptr类中实现智能指针,用类

MyTestObect 测试智能指针。

测试类:MyTestObect

class MyTestObject
{
    string name;
    int age;

public:
    MyTestObject(string s, int a)
    {
        name = s;
        age = a;
        cout << "Object created\n";
    }

    ~MyTestObject(void)
    {
        cout << "Object destroyed\n";
    }

    string GetName()
    {
        return name;
    }

    int GetAge()
    {
        return age;
    }
};
智能指针类:MyAuto_Ptr

获取指针

template <class T>
class MyAuto_Ptr
{
private:
    T *ptr;

public:

    //构造函数
    explicit MyAuto_Ptr(T *p = 0)
        :ptr(p)
    {

    }

    //析构函数
    ~MyAuto_Ptr(void)
    {
         delete ptr;
    }

    //复制构造函数
    MyAuto_Ptr(MyAuto_Ptr<T> &source)
    {
        ptr = source.ptr;

        //Since the ownership gets transferred lets point the source to 0
        source.ptr = 0;
    }

    MyAuto_Ptr& operator=(MyAuto_Ptr<T> &source)
    {
        //check for self reference
        if(ptr != source.ptr)
        {
            //flush the existing memory
            delete ptr;
            ptr = 0;

            // use the new pointer
            ptr = source.ptr;

            //Since the ownership gets transferred lets point the source to 0
            source.ptr = 0;

            return *this;
        }
    }

    //获取指针
    T& operator *()
    {
        return *ptr;
    }

    //

    T* operator ->()
    {
        return ptr;
    }

    //获取指针的值
    T* get()
    {
        return ptr;
    }

    //重设指针的值
    void reset(T *newVal)
    {
        delete ptr;
        ptr = newVal;
    }

    //release the pointer and returns the ownership
    T* release()
    {
        T *t = ptr;
        ptr = 0;
        return t;
    }
};

测试代码:

int main(int argc, char* argv[])
{
    {//dummy brace to test the destruction
        MyAuto_Ptr<MyTestObject> p(new MyTestObject("Rahul Singh", 29));

        //test the -> operator
        cout << "Name: " << p->GetName() << ", Age: " << p->GetAge() << "\n";

        //test the transfer of ownership in copy constructor
        MyAuto_Ptr<MyTestObject> p2(p);

        //test the * operator
        cout << "Name: " << (*p2).GetName() << ", Age: " << (*p2).GetAge() << "\n";

        //test the transfer of ownership in assignment operator
        MyAuto_Ptr<MyTestObject> p3;
        p3 = p2;

        //test the get function
        cout << "Name: " << p3.get()->GetName() << ",
            Age: " << p3.get()->GetAge() << "\n";

        //lets test the reset function
        p3.reset(new MyTestObject("Megha Singh", 28));

        //test the get function
        cout << "Name: " << p3.get()->GetName() << ",
            Age: " << p3.get()->GetAge() << "\n";

        //finally lets test the release function
        MyAuto_Ptr<MyTestObject> p4(p3.release());

        cout << "Name: " << p4.get()->GetName() << ",
            Age: " << p4.get()->GetAge() << "\n";
    }
    getchar();
    return 0;
}



From Java to C++ 第五篇之智能指针 前叙 From Java to C++ 第一篇From Java to C++ 第二篇From Java to C++ 第三篇From Java to C++ 第四篇之内存管理篇 回顾 前面我们了解到RALL的基本用法,可以在方法执行完以后,主动将堆内存对象释放掉,从而简化了内存管理,解决内存泄漏的可能,这次我们学习下RALL,如果做一个完善的智能指针。 智能指针的本质 它的出现其实是为了解决由于... 阅读详情

相关推荐

使用智能指针创建单链表

智能指针实现单链表

Esmusssein_的博客 1196

C++智能指针

C++里面的四个智能指针: auto_ptr,shared_ptr,unique_ptr, weak_ptr

weixin_52259848的博客 2924

LLC谐振变换器设计实战:从工作原理到参数设计与调试

开关电源设计是电力电子领域的核心技术,其核心目标在于提升效率与功率密度。为实现这一目标,软开关技术应运而生,它通过精心控制开关器件的电压与电流波形,使其在开通或关断瞬间实现零电压或零电流切换,从而从根本上降低开关损耗。LLC谐振变换器正是这一技术的杰出代表,它通过引入谐振网络,巧妙地实现了主开关管的零电压开关和次级整流管的零电流开关。这种拓扑结构在服务器电源、通信设备及高端显示驱动等要求高效率、高功率密度的应用场景中价值显著。本文将以半桥LLC为例,深入剖析其工作模态与增益特性,并系统阐述其参数设计、仿真验

weixin_34129696的博客 559

C++ 智能指针

智能指针分为:auto_ptr、shared_ptr、weak_ptr、unique_ptr。 智能指针主要作用: 1、防止忘记调用delete释放内存; 2、管理在堆上分配的内存,它将普通的指针封装为一个栈对象,实质是一个对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。 auto_ptr shared_ptr 1、定义 shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,

a777122的博客 1566

Unity游戏开发实战:用柏林噪声打造3D随机地形(附完整C#代码)

本文详细介绍了如何在Unity游戏开发中使用柏林噪声算法生成3D随机地形,包含完整的C#代码实现。从基础柏林噪声原理到高级参数控制,再到性能优化和常见问题解决,帮助开发者掌握程序化地形生成技术,打造丰富多变的游戏世界。

weixin_29281941的博客 98

华硕三频万兆分布式路由组网实战:从AiMesh 2.0到全屋Wi-Fi 6覆盖

Mesh组网是解决大户型Wi-Fi覆盖难题的主流方案,其核心原理是通过多个节点构建网状网络,实现设备间的无缝漫游。在技术层面,Wi-Fi 6标准、三频设计(包括专属回程频段)和有线回程等技术,共同提升了网络的带宽、稳定性和抗干扰能力。这些技术的工程价值在于,能够为多设备并发、高带宽应用(如4K/8K流媒体、在线游戏、内网文件高速传输)提供可靠支撑。具体到应用场景,例如利用华硕AiMesh 2.0系统,配合三频万兆分布式路由器,可以实现智能的设备连接与负载均衡。通过合理规划节点位置、优先采用有线回程,并进行Q

weixin_34054866的博客 431

C++:智能指针

本文介绍了智能指针的概念和原理,以及C++标准库中的auto_ptr、unique_ptr和shared_ptr三种智能指针,分析了shared_ptr中的循环引用问题,并由shared_ptr的循环引用问题出发点,介绍了weak_ptr。

weixin_43908419的博客 8673

Ollama部署本地大模型详细教程

创建ModelfilePARAMETER num_gpu 50 # GPU 层卸载比例(0~100)场景是否推荐本地开发/测试 Agent✅ 强烈推荐内部知识库问答(RAG)✅ 推荐(配合 Pgvector)生产环境高并发服务⚠️ 谨慎(建议评估 vLLM / Triton)需要 Function Calling 的 Agent❌ 不推荐(改用 DashScope API)🔑核心价值Ollama 是“本地大模型的 Docker”——让开源模型像容器一样 easy to run。

我们的征途是星辰大海 2614

C++智能指针详解

智能指针有多智能?

小白成长之路 1万+

安卓游戏存档修改全攻略:以《英雄迷宫冒险》为例(附避坑指南)

本文详细介绍了安卓游戏存档修改的全过程,以《英雄迷宫冒险》为例,涵盖基础认知、工具选择、实战修改及风险控制。通过十六进制编辑和UTF-8编码解析,玩家可以修改金钱、角色属性和物品数量等数据,同时提供了避坑指南和伦理考量,帮助玩家在享受修改乐趣的同时保持游戏体验的平衡。

weixin_29209801的博客 392

基于Python实现身份证信息识别

身份证是一种重要的证件,包含了个人的基本信息,如姓名、性别、出生日期、住址等。在实际应用中,有时需要对身份证进行自动化的识别,以提高工作效率和准确性。本文将介绍如何使用Python实现身份证信息的识别,通过图像预处理、OCR技术和解析算法,实现对身份证号码和其他信息的提取和解析。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

【C++】智能指针

实例对象的引用计数变为2,在共享智能指针离开作用域之后引用计数只能减为1,这种情况下不会去删除智能指针管理的内存,导致类TA、TB的实例对象不能被析构,最终造成内存泄露。也被析构,其对TA对象的管理解除,内存的引用计数减为1,当共享智能指针ap离开作用域之后,对TA对象的管理也解除了,内存的引用计数减为0,类TA的实例对象被析构。类型,这个赋值操作并不会增加引用计数,所以bp的引用计数仍然为1,在离开作用域之后bp的引用计数减为0,类TB的实例对象被析构。

IdealSanX的博客 2748

破晓之光:GTK#框架让C# WinForm程序跨平台运行的终极指南

GTK#框架的出现,彻底打破了C# WinForm只能在Windows上运行的桎梏。

墨夶的博客 603

深入理解 C++ 智能指针

智能指针和RAII(资源获取即初始化)是两个重要的概念,用于管理动态内存和其他资源。智能指针是一种自动管理内存的工具,通过引用计数或其他机制来确保资源的正确释放,从而避免内存泄漏和悬空指针的问题。RAII则是一种编程范式,利用对象的生命周期来管理资源的获取和释放,通过对象的构造函数获取资源,而在对象销毁时自动释放资源,从而确保资源的正确管理。本文介绍了C++中常见的智能指针类型,包括std::unique_ptr和std::shared_ptr,以及如何使用它们来避免内存泄漏和提高程序的安全性。

无敌岩雀的博客 1748

Linux----Ubuntu系统官网下载iso镜像文件

Linux----Ubuntu系统官网下载iso镜像文件

MQ0522的博客 5万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++新特性(五)智能指针

不同于java的垃圾回收机制,C++需要程序员自己申请资源,使用完资源以后还要记得释放资源,例如new和delete要配套使用;文件打开以后使用完要关闭;数据库连接以后使用完要断开…这都是程序员需要额外注意的点。忘记了资源释放,会造成资源泄露。为了做到智能释放使用完的资源,C++有了智能指针的技术。结合类使用了引用计数的想法,使程序员不用再担心资源释放的问题。(RAII思想) 下面先介绍一下RAII思想 1,RAII思想 众所周知,一个类对象创建会自动调用构造函数,析构会自动调用析构函数。因此我们可以利用此

weixin_42445051的博客 1818

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++智能指针

shared_ptr、unique_ptr和weak_ptr三种标准库的智能指针的简明介绍,不涉及重要应用

jack的博客 1173

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

解析 C++ 智能指针的奇特之处

在现代编程中,智能指针是高效内存管理的利器。无论是初学者还是资深开发者,掌握智能指针的奥秘都能让你的代码更加优雅、安全。这篇文章将带你快速了解智能指针的基础概念,深入剖析三种常见智能指针的使用方法,并探索它们的应用场景。快来一起解锁智能指针的魔法吧!✨。

CoderAlice 1132

C++ 动态内存管理/智能指针

文章目录概述std::shared_ptrenable_shared_from_thissharedptr线程安全 概述 C++智能指针位于标准库头文件 ,此头文件是动态内存管理库的一部分。 std::shared_ptr https://zh.cppreference.com/w/cpp/memory/shared_ptr enable_shared_from_this https://zh.cppreference.com/w/cpp/memory/enable_shared_from_this ht

mayue_web的博客 317

C++智能指针简介

std::unique_ptr:独占所有权,不能复制,支持移动语义。std::shared_ptr:共享所有权,引用计数管理生命周期,支持多次引用。std::weak_ptr:不拥有对象,防止循环引用,弱引用。

yao_tao11的博客 987

智能指针 unique_ptr 详解

一、智能指针 1.什么是智能指针 简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。 2.常规指针存在的问题 C++在内存分配、释放和管理方面向程序猿提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序猿能够制造与内存相关的问题,比如内存泄漏。 例如在堆声明和分配的内存,析构方法是否会自动销毁对象,又或是方法结束后需要一个个释放,方法存在很多返回的

顺其自然~专栏 2万+

C++中智能指针使用的思考

C++中的智能指针使用 智能指针主要是用于内存不容易管理的情况,最好不要胡乱使用。不要产生,所有裸指针都可替换为智能指针,将share_ptr用到底的想法。这些都是我曾经错误的想法…………下面说一下目前使用过程中的一些思考 智能指针要去考虑所有权的问题,所有权分为共享和独占,对应了shared_ptr和unique_ptr。 shared_ptr的坑 不要把裸指针全部替换为shared_ptr,这里面有很多的坑(参考链接)。shared_ptr 通常使用在共享权不明的场景,有可能多个对象同时管理同一个内存时

weixin_43428806的博客 216

C++智能指针总结(面试常问)

C++智能指针总结(面试常问)1.智能指针的实现原理2. C++11四种智能指针总结2.1 auto_ptr:2.2 unique_ptr:2.3 share_ptr:2.4 weak_ptr: 1.智能指针的实现原理 智能指针的实现原理就是在一个类的内部封装了类对象的指针,然后在析构函数里对我们的类对象指针进行释放,因为类的析构是在类对象生命期结束时自动调用的,这样我们就省去了手动释放内存的操作,避免忘记手动释放导致的内存泄漏。 2. C++11四种智能指针总结 2.1 auto_ptr: auto_

Sunrise的博客 5147

C++总结笔记(十二)—— 智能指针

个人总结

baidu_35536188的博客 991
上一篇: Understanding and Implementing Observer Pattern in C++
下一篇: 用JS验证输入框只能输入数值型数据
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值