C++智能指针实例详解

C++智能指针实例详解

什么是智能指针

智能指针是一种可以自动管理内存释放的C++指针,它能够自动控制指针对象的生命周期,只要最后一个引用指向了该对象,指针就会自动释放。由于智能指针能够自动释放内存,因此可以避免一些常见的内存泄露问题。

在C++中,有三种常见的智能指针:

  • unique_ptr:独占式智能指针,不能被拷贝。当其拥有的对象被销毁时,它也将自动被销毁。
  • shared_ptr:共享式智能指针,可以通过复制共享。当最后一个引用指向该对象时,该对象将被销毁。
  • weak_ptr:弱引用式智能指针,它不会改变所指对象的引用计数,因此不影响所指对象的生命周期。

unique_ptr示例

假设我们定义了一个名为“Person”的类,然后定义一个unique_ptr对象来管理这个类的实例化,如下所示:

#include <iostream>
#include <memory>

class Person
{
public:
    Person(std::string name) : name_(name) {}
    ~Person() { std::cout << name_ << "被析构了" << std::endl; }

    void SayHello() { std::cout << "我的名字是" << name_ << std::endl; }

private:
    std::string name_;
};

int main()
{
    std::unique_ptr<Person> person_ptr(new Person("张三"));
    person_ptr->SayHello();

    return 0;
}

在这个示例中,我们使用unique_ptr来管理Person对象的生命周期。当该对象被销毁时,unique_ptr会自动将其释放。注意到我们不能通过复制该指针来共享这个Person对象,因为unique_ptr是独占式智能指针。

shared_ptr示例

现在假设我们有两个Person对象,我们想要两个指针都指向同一个对象。我们可以使用shared_ptr来实现这个目标,示例如下:

#include <iostream>
#include <memory>

class Person
{
public:
    Person(std::string name) : name_(name) {}
    ~Person() { std::cout << name_ << "被析构了" << std::endl; }

    void SayHello() { std::cout << "我的名字是" << name_ << std::endl; }

private:
    std::string name_;
};

int main()
{
    std::shared_ptr<Person> person_ptr1(new Person("张三"));
    std::shared_ptr<Person> person_ptr2(person_ptr1);

    person_ptr1->SayHello();
    person_ptr2->SayHello();

    return 0;
}

在这个示例中,我们使用shared_ptr构造了两个指针,分别指向同一个Person对象。注意到这里我们可以通过复制智能指针来共享Person对象,因为shared_ptr是共享式智能指针。

总结

智能指针是C++中自动管理内存释放的一种重要工具。在使用智能指针时,我们应该明确不同类型的智能指针的差异以及各自的优势,并根据实际情况选择合适的智能指针。

示例中的代码只是演示智能指针的基本用法,有些细节和实现方式可能与实际情况略有不同,具体情况可以根据具体需求进行调整和优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++智能指针实例详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Python双向链表插入节点方式

    Python中的双向链表可以用于存储有序的数据,同时也支持插入和删除节点。本文将详细介绍Python中双向链表的插入节点的方式: 双向链表插入节点方式 双向链表中每个节点有两个指针prev和next,分别表示指向前驱节点和后继节点。在插入节点时,需要修改前驱节点、后继节点以及新节点的指针关系。 头部插入 头部插入指的是在链表的头部插入新节点。具体步骤如下: …

    other 2023年6月27日
    00
  • 详解iOS App开发中改变UIButton内部控件的基本方法

    当我们需要修改UIButton内部控件时,比如改变UIButton的文字或者图片,或者其他一些自定义修改,通常我们可以使用UIButton的子类化来实现。 以下是一些步骤和示例来详解iOS App开发中改变UIButton内部控件的基本方法: 1. 创建一个UIButton的子类来自定义UIButton 创建一个名为MyButton的UIButton子类,可…

    other 2023年6月26日
    00
  • 一道常被人轻视的web前端常见面试题(JS)

    一道常被人轻视的web前端常见面试题(JS) 完整攻略 题目描述 假设有一个 getRandom() 函数可以随机生成 0 ~ 9 之间的整数,请编写一个 getRandomArray(n) 函数,返回长度为 n 的由随机整数组成的数组。 解题思路 这道题看起来比较简单,只需要使用 for 循环调用一遍 getRandom 函数,然后存储到结果数组中即可。具…

    other 2023年6月26日
    00
  • ios9/iPhone6s/6s plus未受信任的企业级开发者怎么解决?

    问题描述: 在iOS9及以上版本中,如果企业开发者使用自己的证书为自己开发的应用签名并分发给内部员工或外部用户,可能会遇到受信任的问题,从而无法安装应用。 解决方法: 要解决这个问题,需要以下步骤: 在企业级开发者后台重新生成并下载最新的证书和描述文件,并确保它们与应用匹配。 在企业级开发者后台中创建一个.plist文件,用于安装描述文件时安装iOS应用程序…

    other 2023年6月26日
    00
  • 服务名无效。请键入nethelpmsg2185以获得更多的帮助。

    服务名无效。请键入nethelpmsg2185以获得更多的帮助。 在使用Windows Server操作系统时,有时会出现”服务名无效。请键入nethelpmsg2185以获得更多的帮助。”的错误提示。这个错误提示通常是由于服务名拼写错误或服务未启动导致的。 常见的解决方法包括以下几种: 检查服务名拼写 如果出现该错误提示,首先需要检查服务名是否拼写正确。确…

    其他 2023年3月29日
    00
  • 【mybatis】mybatis中update更新操作 null字段不更新 有…

    【mybatis】mybatis中update更新操作 null字段不更新 有哪些解决方案? 在Mybatis中,我们经常需要使用update语句来更新数据库中的数据,但是在数据更新时,有时候我们并不想更新所有字段,比如某些字段的值为null,我们不希望将null值更新到数据库中。那么,在Mybatis中,该如何实现null字段不更新的功能呢?本文将为大家介…

    其他 2023年3月28日
    00
  • Java NIO服务器端开发详解

    下面详细讲解一下“Java NIO服务器端开发详解”的完整攻略。 简介 Java NIO(New IO,非阻塞IO)是Java中一套支持IO多路复用的新的API,相比于传统的IO,Java NIO能够更好地利用多核CPU的性能,同时也可以更好地实现高并发。 在Java NIO中,以Channel为中心,数据的读写以及网络的传输都是通过Channel进行的。C…

    other 2023年6月27日
    00
  • iOS AFNetworking各种功能封装类代码

    iOS AFNetworking 各种功能封装类代码攻略 什么是 AFNetworking? AFNetworking 是一个 iOS & macOS 平台上的网络请求框架,它是由 Objective-C 编写而成,是一个轻量级的网络库,提供了 URLSession API 不具备的高级别的抽象。AFNetworking 已经被 iOS 开发者广泛应…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部