再学智能指针

再学C++:高级特性:智能指针及其理解 的内存管理始终是一个难题,尤其是引入指针后,共享独享与垃圾回收异常困难。 例如下列代码中,三个指针实际上指向同一个实例,将释放后会出现严重的内存问题,此时的被置为,而1和成为悬空指针。 因而为了方便的解决内存管理,将指针的使用与RAII技术结合,智能指针诞生了。目前可用的智能指针共有3种,分别是是独占所有权的智能指针,同一时间内只有一个指针可以拥有所指对象的所有权。它在对象生命周期结束时自动释放资源。可以认为,独享指针和它绑定的对象,是强绑定的,谁都不能离开谁。 用一个示例快速带大家理解 其达成的效果很明显 阅读详情
/*
 * =====================================================================================
 *
 *       Filename:  smart_pointer.cpp
 *
 *    Description:  智能指针学习
 *			 
 *
 *        Version:  1.0
 *        Created:  08/25/2012 08:48:12 PM
 *       Revision:  none
 *       Compiler:  g++
 *
 *         Author:  lsff (lsff), 
 *    
 *
 * =====================================================================================
 */
#include <stdlib.h>
#include <iostream>
#include <cstdio>
using namespace std;

typedef int T;	// 共享的东西的类型

/*
 * 计数类: 存储核心指针,核心指针指向真正的数据
 *		   这个类是不做任何操作的
 *		   负责存放目前指向对象自身的指针个数及真正的指针
 */
class u_ptr
{
	friend class HasPtr; 
	size_t use;
	T* pCommon;
	u_ptr(T* pCommon):pCommon(pCommon), use(1){}
	~u_ptr() {  if(pCommon) {cout<<"delete:"<<*pCommon<<endl;delete []pCommon; }pCommon=NULL;}
	T*& operator->()
	{
		return pCommon;
	}
};

/*
 * 真正的智能指针:
 *		负责对上面的计数指针进行维护
 *			1) 这个智能指针可以像普通指针用
 *			2)保证了2个点:指针赋值和初始化(用本类指针对象)
 *							发生时,对维护的计数指针进行值复制的同时,记录了
 *							所有指向计数指针个数
 *			3)在对象的计数指针没有被其它对象指向的时候删除对象
 *		好处: 避免野指针; 避免重复delete同一地址
 *
 *  其实可以把上面的计数类看作是数据类,而本类就是操作类
 */
class HasPtr
{
	private:
		u_ptr* ptr;
	public:
		/*
		 *  注意在四大函数对 计数类的维护
		 */
		HasPtr(T* p=NULL):ptr(new u_ptr(p)){} //允许指针值为NULL
		~HasPtr() { if(ptr &&0==--(ptr->use)) delete ptr; } //
		HasPtr(const HasPtr& orig): ptr(orig.ptr){ if(ptr)++ptr->use;  } //this->().->use
		HasPtr& operator=(HasPtr& ); 

		HasPtr& operator=(T* pt);  // 让智能指针更像普通的指针
		u_ptr*& operator ->(){ return ptr;} 

		void showVal()const 
		{
			printf("ptr: %p\tptr->use:%d\tptr->pCommon:%p\t*ptr->pCommon:%d\n", ptr,ptr->use,ptr->pCommon,*(ptr->pCommon));
		}
};

HasPtr& HasPtr::operator=(HasPtr& rhs)
{
//	cout<<"this->->use:"<<(this->operator->())->use<<endl; //可以
//	cout<<"this->->use:"<<this->->use<<endl;			   //不可以
	if(rhs.ptr) ++(rhs->use);
	if(ptr&&0==--ptr->use){  delete ptr; ptr=NULL;}
	this->ptr=rhs.ptr;
	return *this;
}

HasPtr& HasPtr::operator=(T* pt)
{
	HasPtr tmp = pt;
	*this=tmp;
	return *this;
}

class tst
{
	private :
		HasPtr sp;
	public:
		tst():sp(NULL){
			sp=new T(4);
			sp.showVal();
			throw "构造函数时出错!";
		}
		~tst()
		{
			cout<<__FUNCTION__<<endl;
		}
		void show()
		{
			sp.showVal();
		}
};



int main()
{

	try{
		tst tst1;
		tst1.show();
		tst tst2=tst1;
		tst2.show();
		HasPtr hp=new T(3);
		*(hp->pCommon)=4;
	}
	catch(const char*e )
	{
		cout<<e<<endl;	  // 就算是构造函数中发生了异常,申请的堆空间也照样释放了
	}
	return 0;	
}

c++面试题每日一学记录-RAII与智能指针 RAII提供通用资源管理范式unique_ptr用于独占资源,性能最优处理共享资源,需警惕循环引用优先使用避免裸指针和智能指针混用多线程环境下注意对象状态同步。 阅读详情

相关推荐

【C++】————智能指针

在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。c++中用的最多的是下面三种智能指针。

bhbcdxb123的博客 2813

学校学不到的——智能指针

智能指针是C++11的新特新之一,最要作用是可以防止内存泄漏。

weixin_58234579的博客 1900

C++智能指针以及我们为什么要使用智能指针

简单介绍两种智能指针,以及说明我们为什么要使用智能指针。

dyamoo的博客 1528

小白学c++之智能指针

占位符的 int      double string counter ptr1(new test); counter ptr(pt);//错误使用,智能指针指向的是堆内存 static成员函数是自由函数 parentptr --->parent(childptr)                       ||        

314

2023东华大学OJ机试题22-70

东华大学计算机考研复试机试22 约瑟夫环223、整除的尾数24、回文质数25、汽水瓶26、阶乘最后的非0位27、算菜价28、 水果价格29、求奇数的乘积30、求最晚和最早日期31、素数32、计算e33 数字之和34 繁殖问题35 奇妙的数字36 整除的尾数37 黑色星期五38 树39 约瑟夫环40 最大与最小41 环42 求数列项43 最高频率44 三艘船45 回文数46 特殊四位数47 最大值48 数列149 修理牛棚50 按要求输出序列51 部落人乘法52 序列53 双重回文数54 等差数列55 人见人

m0_49263811的博客 2597

SAP批量程序(一)-静态批量EX,FX和期间批量MB,WB和TB

SAP批量程序(一)-静态批量和区间批量

weixin_38974136的博客 5476

趣味学RUST基础篇(智能指针1)

Box<T>在 Rust 中,是“取引用”,是“解引用”。let x = 5;let y = &x;// y 是个引用,指向 xassert_eq!(5, *y);// 必须加 * 才能“解开”引用,拿到里面的 5如果你写assert_eq!(5, y),会报错:“你不能拿一个整数和一个‘指向整数的指针’比较!所以:*y的作用就是“顺着箭头找到背后的值”。

编码浪子的专栏 1400

PX4 EKF2协方差矩阵‘负定’了怎么办?保姆级排查与数值稳定性修复指南

本文深入解析PX4 EKF2协方差矩阵出现‘负定’问题的原因,并提供全面的排查与修复方案。从理论分析到实践操作,详细介绍了数值稳定性危机的诊断工具、算法加固措施及工程实践中的防御性编程技巧,帮助飞控工程师有效解决滤波算法中的数值稳定性问题。

weixin_28730927的博客 318

C++ 智能指针深度解析【C++进阶每日一学】

本文详细讲解智能指针的功能、用法,帮助你进阶C++资深大佬

不会C++、害怕嵌入式且不爱看动漫的小趴菜 2万+

一维光子晶体态密度计算与应用解析

态密度(DOS)是凝聚态物理和光子学中的核心概念,描述了量子态在能量空间的分布规律。基于麦克斯韦方程组的周期性介电结构分析表明,一维光子晶体通过布拉格散射形成光子带隙,其态密度曲线呈现典型的范霍夫奇点和禁带特征。这种特性使光子晶体在光学工程中具有重要价值,特别是在滤波器设计和传感器开发领域。通过转移矩阵法等数值计算手段,可以精确预测带隙位置和宽度,其中折射率对比度与周期数是关键设计参数。实际应用中,1550nm通信波段滤波器常采用Si/SiO2交替结构,而引入缺陷层则能产生高Q值缺陷模。计算优化时需注意数值

weixin_36487018的博客 193

硬件工程师笔记——三极管Multisim电路仿真实验汇总

NPN型三极管:由N型半导体、P型半导体和N型半导体组成,即NPN结构。 PNP型三极管:由P型半导体、N型半导体和P型半导体组成,即PNP结构。 三极管的工作原理基于电流的控制和放大,其核心是基区对电流的控制作用。 将三极管等效为两个串联的二极管进行等效分析

XU157303764的博客 2635

趣味学RUST基础篇(智能指针2)

当一个变量“寿终正寝”(离开作用域)的时候,Rust 会自动调用一个叫drop的函数,帮你把它的“遗物”(比如堆内存、文件句柄)收拾干净。这在其他语言里,你得自己记得说:“喂,我用完这个对象了,快释放内存!但在 Rust,你什么都不用做——它自己会默默收拾好,还不会忘。举个栗子:你用Box<T>分配了一块内存,用完之后,只要变量超出作用域,Rust 就会自动释放那块内存。不用手动free(),也不会内存泄漏。因为 Rust 有Drop这个贴心管家。当然可以!

编码浪子的专栏 1153

最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。

努力让自己发光,对的人才能迎着光而来 14万+

什么?学了C++11你还不会智能指针?那这篇文章你一定不能错过!

资源获得立刻初始化。

2301_80689220的博客 6009

YOLOv11 改进入门篇 | 从原理到代码:CBAM 注意力模块的插入与涨点验证

本文介绍了如何在YOLOv11模型中插入CBAM注意力模块以提升检测性能。CBAM包含通道和空间注意力两个子模块,通过双池化操作和MLP学习特征权重。文章详细解析了CBAM原理,提供了PyTorch实现代码,并建议在YOLOv11的Stage-3和Stage-4之间插入CBAM。实验表明,该方法在COCO数据集上使nano和small模型的mAP提升1.7-2.3个百分点,参数量仅增加0.27%,推理延迟增加0.1ms。最后给出了插入位置选择、通道缩减比等调优建议,验证了CBAM作为轻量级注意力模块的有效性

shrgegrb的博客 1301

Unity开发AR之Vuforia-MultiTarget笔记

在增强现实(AR)技术蓬勃发展的今天,越来越多的开发者开始探索如何将AR应用于各种场景中。Vuforia作为一个领先的AR开发平台,为开发者提供了强大的工具和功能,使得创建AR体验变得更加简单和直观。本文将为您介绍Vuforia的基本概念、特点,以及如何配置和使用MultiTarget功能,旨在帮助您更加深入地理解Vuforia SDK,并在您的项目中有效地应用。Vuforia是一个由PTC开发的增强现实SDK,它提供了丰富的功能,使团队能够在各种设备上创建互动的AR应用。

TxNet 1049

【20天学C++】Day 16: 智能指针

【20天学C++】Day 16: 智能指针总结 智能指针是C++中管理动态内存的重要工具,解决了传统指针的内存泄漏问题。主要内容包括: unique_ptr:独占所有权,不可复制但可移动,适用于单所有者场景 shared_ptr:共享所有权,通过引用计数管理资源,适用于多所有者场景 weak_ptr:弱引用,不增加引用计数,解决shared_ptr循环引用问题 自定义删除器:支持为智能指针指定特殊清理逻辑 关键特性: 自动内存管理,异常安全 make_unique/make_shared更安全高效 weak

yydszycheng 170

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

小学生学C++编程语法知识(C++智能指针)

本课内容: 普通指针到底怎么用? 为什么需要智能指针? 自己手写一个最简单的智能指针

汉克老师的博客 417

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

学C++day10异常处理、类型转换、智能指针

异常处理 C++声明函数的时候可以在函数的末尾加上throw() 表示显式告诉编译器,我这个函数会抛出异常 1. try后面可以跟多个catch 表示try语句块里面的代码,可能会抛出多种不同类型的错误 2. 要注意的问题 第一个:try里面抛出的错误,必须catch捕捉并处理,不捕捉会段错误 3. 总结常见的异常情况 第一种:抛基本数据类型的异常 第二种:抛自定义的异常类 4. 自定义的异常类

weixin_53605054的博客 154

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Effective C++ 学记之17 以独立语句将newed对象置入智能指针

以独立语句将newed对象置入智能指针内。如若不然,一旦异常被抛出,有可能导致难以察觉的资源泄露。 来一例: int priority();//处理程序优先权的函数 void processWidget(std::tr1::shared_ptr pw, int priority);//该函数在动态分配所得的Widget上进行某些带有优先权的处理。 调用: processWidge

O(∩_∩)O 662

杂学杂记(六)智能指针简介(强指针、弱指针)

智能指针的原理及实现        当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个

l461269717的专栏 973

[咬文嚼字学C++]用来初始化智能指针的普通指针必须指向动态内存

如果违反了会有什么后果 看一个例子: #include <iostream> #include <memory> int main(int argc, char **argv){ int x = 10; std::shared_ptr<int> spi{&x}; std::cout << *spi << std::endl; //10 std::cout << "usre_count:" &

tianyingang的博客 365

21天学通C++读书笔记(二十五:理解智能指针)

第26章 理解智能指针

qq_42994487的博客 188

【C++11】智能指针深度详解(什么是智能指针?为什么需要智能指针?如何使用智能指针?)

智能指针这个名词听着挺唬人,其实也没啥,无非就是会自动销毁new出来的对象,对于日常使用来说,还是挺方便的,毕竟C/C++可没有隔壁Java的垃圾回收机制GC,得自己清理垃圾,智能指针可以自动完成垃圾清理这个工作

weixin_45031801的博客 7667

【C++】智能指针

C++中的智能指针,重点讨论了其设计思路、使用场景及标准库中的实现。智能指针基于RAII(资源获取即初始化)原则,通过类的生命周期管理资源,确保资源在异常抛出时仍能正确释放,避免内存泄漏。标准库提供了多种智能指针,如auto_ptr(已弃用)、unique_ptr(独占资源)、shared_ptr(共享资源)和weak_ptr(解决循环引用问题)。shared_ptr通过引用计数管理资源,而weak_ptr则用于打破shared_ptr的循环引用,避免内存泄漏。此外,智能指针还支持删除器,允许自定

记录学习与成长 3211

【C++11】智能指针

早期在C语言中我们学习了指针,这个指针学起来真是一个头两个大,当然学习到了这里想必大家对指针就不在害怕了,为了填上C++的不足在C++11中就扩展了智能指针,难道智能指针就真的那么智能吗?⭐主体。

AAlykk的博客 1298
上一篇: C++中智能指针的设计和使用
下一篇: vim 正则搜索替换
lsff01
博客等级 码龄14年 4粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值