自己实现智能指针

【C++】【原创】从0开始实现智能指针 智能指针:能够保证资源的绝对释放,里面默认都是delete ptr释放资源的但不是所有的资源都是能够通过delete释放的,毕竟资源那么多种类比如我用智能指针托管数组的话,那delete就不行,得用delete[]再比如我让它管理的不是内存资源,而是文件资源,那释放文件也绝对不可能用delete释放的所以在我们除了智能指针在堆内存外,怎么正确指导智能指针来正确删除呢先讲讲智能指针内部是咋回事吧unique_ptr shared_ptr 一个不带计数,一个带计数他们两个都是可以带自定义删除器的。 阅读详情

自己实现智能指针

#include <utility>
using namespace std;

template <class T>
class MyUniquePtr {
 public:
  // 默认构造函数
  explicit MyUniquePtr(T* p = nullptr) noexcept { myptr_ = nullptr; }

  // 移动构造
  explicit MyUniquePtr(MyUniquePtr&& p) noexcept;

  // 移动赋值
  MyUniquePtr& operator=(MyUniquePtr&& p) noexcept;

  // 禁止拷贝构造
  MyUniquePtr(const MyUniquePtr& p) = delete;

  // 禁止赋值构造
  MyUniquePtr& operator=(const MyUniquePtr& p) = delete;

  // 析构函数
  ~MyUniquePtr() {
    if (myptr_) {
      delete myptr_;
    }
  }

  // operator ->
  T& operator->() noexcept { return *myptr_; }

  // operator *
  T* operator*() noexcept { return myptr_; }

  // get
  T* get() { return myptr_; }

  // resert

  void realse(T* p = nullptr) {
    if (myptr_) {
      delete myptr_;
    }
    myptr_ = p;
  }

  // swap
  void swap(MyUniquePtr& p) { swap(myptr_, p.myptr_); }

  // realse
  T* realse() {
    T* res = myptr_;
    myptr_ = nullptr;
    return m = res;
  }

 private:
  T* myptr_;
};

template <class T>
MyUniquePtr<T>::MyUniquePtr(MyUniquePtr&& p) noexcept {
  this->myptr_ = p.myptr_;
  p.myptr_ = nullptr;
}

template <class T>
MyUniquePtr<T>& MyUniquePtr<T>::operator=(MyUniquePtr&& p) noexcept {
  swap(*this, p);
}

/*
    被noexpect修饰的函数抛出异常,编译器会直接选择调用
    标准库的dts::terminate()直接终止程序,比throw()高效
    可以有效的防止异常的扩散传播
 */
C++智能指针的使用与实现 1.什么是智能指针  C++的智能指针其实就是对普通指针的封装(即封装成一个类),通过重载 * 和 -&gt;两个运算符,使得智能指针表现的就像普通指针一样。 2.智能指针的作用            C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高 了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,... 阅读详情

相关推荐

如何实现一个简单的智能指针

所谓智能指针指的是一种用起来像指针但又无需关心内存管理的一种机制。   普通指针的问题 C/C++中指针极为常见,但普通指针最大的问题就在于需要程序员记住分配内存后要手动释放,否则就会有内存泄漏或者引用野指针的风险。 比如有这样一个简单的类: class person { public: person() {} ~person(){ cout<<"delete...

码农的荒岛求生 1528

3.7 C++高级编程_自己实现智能指针

先定义一个Person类,在Person类中定义一个构造函数,一个析构函数,一个普通的成员函数。然后编写一个测试函数test_func,从内存中申请了一块Person类大小的空间。最后,在main函数中调用test_func函数。这个代码有什么问题呢?我们编译执行一下,可以看到Person类的构造函数被调用了,但是,。也就是说,在程序运行退出后,没有将之前申请的内存释放掉,这时候,就发生了。......

一个嵌入式软件工程师的博客 744

C++实现智能指针

C、C++没有自动内存回收机制,程序员需要手动释放,如果忘记则会导致内存泄露,另外普通指针存在悬垂指针的问题。 何为悬垂指针? 当有多个指针指向同一个对象时,如果某个指针delete了该对象,对这个指针来说它是明确了它所指的对象被释放了,所以它不会再对此对象进行操作,但是对于剩下的其他指针来说呢?它们还傻傻地指向已经被删除的对象,并随时准备对它进行操作,于是悬垂指针就形成了。 代码很简单,我们...

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1160

现代C++编程实战02-自己动手,实现C++的智能指针

你好,我是吴咏炜。上一讲,我们描述了一个某种程度上可以当成智能指针用的类。使用那个智能指针,可以简化资源的管理,从根本上消除资源(包括内存)泄漏的可能性。这一讲我们就来进一步讲解,如何将改造成一个完整的智能指针。你会看到,智能指针本质上并不神秘,其实就是 RAII 资源管理功能的自然展现而已。在学完这一讲之后,你应该会对 C++ 的unique_ptr和shared_ptr的功能非常熟悉了。同时,如果你今后要创建类似的资源管理类,也不会是一件难事。

fegus的博客 667

ESP32搭配FT6236触摸屏:从芯片手册到完整I2C驱动代码的保姆级解析

本文详细解析了ESP32搭配FT6236触摸屏的I2C驱动开发过程,从芯片手册解读到完整代码实现。通过硬件架构分析、寄存器配置、I2C通信封装及触摸数据处理等步骤,提供了一套完整的驱动解决方案,帮助开发者快速掌握ESP32与触摸屏的交互技术。

weixin_29174385的博客 294

Cadence Allegro 17.4学习记录开始02-原理图Capture CIS 17.4

Allegro的第一方网表与第三方网表有以下几个区别点;Ø 与Allegro实现交互式操作的是第一方网表,第三方网表时不可以实现交互式操作;Ø 第三方网表不能将器件的Value属性导入到PCB中,输出时以封装属性来代替Value属性,第一方网表是可以的;Ø 网表导入到PCB中时,第三方的网表需要指定事先指定好PCB封装库文件,并产生Device文件,才可以将网表导入到PCB中,第一方网表则可以直接导入。

qq_31444421的博客 1万+

C++:智能指针实现

weak_ptr不参与资源的管理和释放,可以使用shared_ptr对象来构造weak_ptr对象,但是不能直接使用指针来构造weak_ptr对象,在weak_ptr中,也没有operator*函数和operator->成员函数,不具有一般指针的行为,因此,weak_ptr严格意义上并不是智能指针,weak_ptr的出现,就是为了解决shared_ptr的循环引用问题。但是,只有对象本身析构,它的成员才会析构,因此n1和n2彼此制约对方的析构,最终n1和n2的资源都无法释放,造成了内存泄漏。

tecoes的博客 1589

告别复杂配置:dbswitch vs 传统工具(Kettle/DataX)在Greenplum数据同步中的性能对比

本文深入对比了新兴工具dbswitch与传统ETL工具Kettle、DataX在Greenplum数据同步中的表现。重点分析了dbswitch如何通过免中间文件、利用二进制COPY协议等设计,在异构数据库同步场景下实现更优的性能和更简化的配置,为技术选型提供清晰参考。

transformer2023的博客 1046

自己实现一个智能指针,类比shared_ptr

【代码】自己实现一个智能指针,类比shared_ptr。

DD_Huang的博客 289

折叠式共源共栅放大器设计/备忘

w折叠式共源共栅基本结构如图

Czy1377004611的博客 3万+

stm32f103c8t6+esp8266在WiFi下通过手机控制外设

stm32f103c8t6+esp8266在WiFi下通过手机控制外设前言 前言 通过上一篇,介绍了esp8266的基本功能,这篇将用stm32c8t6配合esp8266进行数据交互,实现用手机通过无线的方式去控制外设、开关等;这里相当于把stm32作为上一篇的串口助手和esp8266进行通信; ...

weixin_45430735的博客 1万+

自己实现简单的智能指针

#include #include using namespace std; template class share { public: share():point(0){} share(T* p1) { point = p1; } ~share() { cout << "begin to delete share" << endl; if

chenycbbc0101的博客 2504

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

智能指针的简单实现

智能指针就是利用系统调用函数执行完后自动释放栈实现的,从而规避程序员忘记释放内存的风险。。。。简单的智能指针实现如下 // smart_ptr.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include &lt;iostream&gt; using namespace std; template&lt;class T&gt; class smar...

Mr Lin 的专栏 410

rknn-toolkit推理yolov5-face.rknn模型--python代码

import os import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN ONNX_MODEL = 'yolov5s.onnx' RKNN_MODEL = 'yolov5s.rknn' IMG_PATH = './bus.jpg' DATASET = './dataset.txt' QUANTIZE_ON = True BOX_THR.

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3079

【数据湖仓】:Iceberg、Hudi 和 Paimon 对比

适用于需要多计算引擎支持和复杂查询的离线批处理场景。其中立性和灵活性使其成为构建新型数据平台的理想选择。:在需要高频数据更新和高效小文件管理的场景中表现出色,适合实时数据处理和增量数据更新的业务需求。:专为实时流式数据处理设计,适用于对数据实时性要求高的业务场景,如实时数据分析和实时指标监控。通过以上分析,可以看出 Apache Iceberg、Apache Hudi 和 Apache Paimon 各有其独特的优势和适用场景。企业应根据自身业务需求和技术栈选择合适的数据湖仓方案,以充分发挥其价值。

欢迎来到我的博客,一起探索代码里的世界! 1610

C++实现智能指针(一)

参考自《C5-C++ Primer》和实验楼相关实验。一. 智能指针概念智能指针的引入:C++中,通过new/delete这对运算符进行动态内存的管理。动态内存使用很容易出问题,因为确保在正确时间释放内存是很困难的。有时忘记释放内存,产生内存泄漏;有时在指针还引用内存时就释放了它,产生引用非法内存的指针。因此,为了更容易和安全地使用动态内存,C++11提供了智能指针(smart pointer)类...

好好的学习空间 584

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++智能指针万字详细讲解(包含智能指针的模拟实现)

智能指针的模拟实现,shared_ptr,weak_ptr原理讲解,智能指针使用,作用,原理,强弱引用计数。

2301_76293625的博客 6388

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

智能指针的原理及实现

本质是利用对象的生命周期来管理资源(内存资源、文件描述符、文件、锁等)

huncho的博客 1386

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ -- 智能指针(自己模拟实现简单的智能指针)

上一篇文章介绍了智能指针的基本概念及boost库里基本的智能指针,这里主要模拟实现库里面的智能指针(简单实现)。 auto_ptr 1.auto_ptr具有RAII和像指针一样的特点。 2.模拟实现: template&amp;amp;amp;lt;class T&amp;amp;amp;gt; class Auto_Ptr { public: //RAII Auto_Ptr(T* ptr) ...

我的博客 9388

c++ 中的智能指针实现

摘要:C++11 中新增加了智能指针来预防内存泄漏的问题,在 share_ptr 中主要是通过“引用计数机制”来实现的。我们今天也来自己实现一个简单的智能指针: 1 // smartPointer.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #inc...

weixin_30790841的博客 278

C 实现智能指针

mbuf

aggresss 2097

C++智能指针由来与实现思想以及实现一个简单的智能指针

智能指针的由来和基本思想 裸指针:int *p = new int; ,其实就是C风格的指针。 裸指针的缺点: 1.必须手动释放资源,手动调用delete; 2.由于程序逻辑的错误return或者throw异常,导致释放资源的代码delete ptr没有被调用到; 3.程序运行过程中,发生异常,导致释放资源的代码没有被调用到。 智能指针 : 智能(不管程序运行发生什么意外的情况,一定会帮用户把资源释放掉),不过利用的思想正是对象出作用域,编译器会自动调用对象的析构函数,保证引用的堆空间被正确的释放。 数据

KingOfMyHeart的博客 459

C++ 手动实现简单的智能指针类

何为智能指针,即不需要用户再自动手动New和Delete掉,由内部类进行new和delete,这样可以防止用户忘记释放掉指针而造成的内存泄漏。 这里简单的实现unique_ptr智能指针的方式。 头文件 // 自制智能指针类头文件 template class SmartPointer{ public: SmartPointer(T* ptr_); ~SmartPointer(); T* oper...

544

C++智能指针的原理和实现

1.智能指针 智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放, 2. 最常用的智能指针 1)std::auto_ptr,有很多问题。 不支持复制(拷贝构造函数)和赋值(operator =),但复制或赋值的时候不会提示出错。因为不能被复制,所以不能被放入容器中。 2) C++11引入的...

于大博 5583
上一篇: 多线程顺序执行实现方式
下一篇: 手动实现atoi
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值