编写auto_ptr感

2024-06-17 14:48
文章标签 编写 auto ptr

本文主要是介绍编写auto_ptr感,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,上自己编写的auto_ptr

#include<iostream>
using namespace std;template<typename T>
class my_auto_ptr
{
public://构造函数my_auto_ptr() :ptr(NULL){}my_auto_ptr(const T *x) :ptr((T *)x){}//拷贝构造函数my_auto_ptr(my_auto_ptr &other){if (&other != this){if (other.ptr == NULL)ptr = NULL;else{ptr = other.ptr;other.ptr = NULL;}}}//赋值函数重载my_auto_ptr& operator=(my_auto_ptr &other){if (&other != this){if (other.ptr == NULL)ptr = NULL;elseptr = other.ptr;}other.ptr = NULL;return *this;}//运算符的重载T* operator->(){return ptr;}T& operator*(){return *ptr;}T* get(){return ptr;}~my_auto_ptr(){if (ptr)delete ptr;}
private:T *ptr;bool state;
};int main()
{char *str2 = "lianyiming";char *a = new char[11];strcpy(a, str2);//无参数构造strmy_auto_ptr<char> str;//传参数构造str1my_auto_ptr<char> str1(a);cout << *str1.get() << endl;//拷贝构造创建,将str1拷贝str3,此时str1变为NULLmy_auto_ptr<char> str3(str1);cout << *str3.get() << endl;//赋值实现,将str3赋值传给str,此时str3变为NULLstr = str3;cout << *str.get() << endl;return 0;
}
    在这里,我们首先要明白,auto_ptr的作用是用来保存一个指针,且这个指针不能指向对象为数组、类等复杂结构的数据。它的作用是,利用类的析构函数对指针指向的空间实现自动释放。然后,就是对auto_ptr的理解,auto_ptr实现保存一个指针,但不能有多个指针同时指向同一空间。即类似单例模式,一个空间,只允许一个智能指针来使用。

    下面,上源代码:

#include<iostream>
//#include<memory>
using namespace std;
//RAII 机制
template<class _Ty>
class auto_ptr
{
public:explicit auto_ptr(_Ty *_P = 0) :_Owns(_P != 0), _Ptr(_P) //_Owns初始化为假{}auto_ptr(const auto_ptr<_Ty> &_Y) :_Owns(_Y._Owns), _Ptr(_Y.release()){}auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y){if (this != &_Y){if (_Ptr != _Y.get()){if (_Owns){delete _Ptr;_Owns = _Y._Owns;}else if (_Y._Owns){_Owns = true;_Ptr = _Y.release();}}}return *this;}~auto_ptr(){if (_Owns)delete _Ptr;}
public://_Ty*release(const auto_ptr<_Ty> *const this)_Ty* release()const{((auto_ptr<_Ty> *)this)->_Owns = false;return _Ptr;}_Ty& operator*()const{return (*get());}_Ty* operator->()const{return(get());}_Ty* get()const{return _Ptr;}
private:bool _Owns;  //是否对内存进行释放  真-->释放; 假-->不调用析构_Ty *_Ptr;
};void main()
{auto_ptr<int> ptr;
}

其为通过_Owns来设置所有权。在这里注意关键字explicit,其目的是为了防止发生隐式的转换构造函数的调用。

这篇关于编写auto_ptr感的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069741

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Wondows dos下怎么编写bat批处理文件

最近搞php,在运行时,以Nginx+php-cgi.exe方式运行Wordpress项目 打开dos,先cd到php-cgi.exe文件当前目录下执行启动命令:php-cgi.exe -b 127.0.0.1:9001再打开一个dos,再cd到nginx.exe文件当前目录下执行启动命令:start nginx 大概过程要经过这些步骤,觉得很麻烦,就学下怎么编写一个bat文件,以双击运行代替

用Python编写倒计时程序:详细教程

目录 引言 环境准备 基本概念 代码实现 步骤一:导入必要的库 步骤二:获取用户输入 步骤三:实现倒计时逻辑 步骤四:整合代码 运行程序 高级功能 扩展功能示例:支持分钟和小时输入 扩展功能示例:图形用户界面 (GUI) 总结 引言 倒计时程序是一个非常常见的小工具,广泛用于各种应用场景中,例如考试时间提醒、烹饪计时器、会议倒计时等。Python 作为一种

【Spring boot】编写代码及测试用例入门之 Hello Spring boot _踩坑记

先贴下目录: 这是我从 start.spring.io 里下载的依赖Web的模板 // DemoApplication.javapackage com.abloume.springboot.blog.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autocon

windows下使用vscode编写运行以及调试C/C++

vscode支持类似于vs的断点调试c/c++,也可以直接编译&运行c/c++ 先是编译运行 c/c++的方法                              微软官方起初设定的科学做法(这也是现在的科学做法)是通过在vscode集成控制台写命令行的方式来实现编译运行程序的,但也可以通过code runner插件来简化步骤,实现一键编译执行 但无论是什么方法,因为vscod

Python编写简单登录系统的完整指南

在现代应用中,用户认证和登录系统是一个非常重要的功能。通过登录系统,应用能够识别用户的身份,并为其提供相应的权限和服务。本文将介绍如何使用Python编写一个简单的登录系统,包括用户注册、登录验证、密码加密等功能。通过这一教程,将学习如何构建一个基本的用户登录系统,并理解其中的关键技术。 这里插播一条粉丝福利,如果你在学习Python或者有计划学习Python,想在未来人工智能领域吃上一口饭的,

springboot项目编写发送异常日志到企微工具包

1.创建基础Bean public final class ThreadFactory implements java.util.concurrent.ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;priva