利用智能指针管理第三方库分配内存

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

《深入应用C++11代码优化与工程级应用》第四章的读书笔记,以及自己写的一些测试demo

第三方库分配的内存一般需要通过第三方库提供的释放接口才能释放,由于第三方库返回的指针一般都是原始指针,用完之后如果没有调用第三方库的释放接口,就很容易造成内存泄露。
例如

void *p = GetHandle()->Create();
//do something
GetHandle()->Realease(p);

用智能指针来管理第三方库的内存就比较方便,不用担心中途返回或者发生异常导致无法调用释放接口的问题。

void *p = GetHandle()->Create();
//do something
std::shared_ptr<void> sp(p, [this](void* p) {GetHandle()->Realease(p); });

将其提炼成函数

std::shared_ptr<void> Guard(void*p)
{
	 std::shared_ptr<void> sp(p, [this](void* p) {GetHandle()->Realease(p); });
	 return sp;
}

//在使用时
void* p = GetHandle()->Create();
Guard(p); //危险,这句结束后p就被释放了
//do something

执行Guard§;这句后,函数返回的是一个右值,没有被存储,用完就把p释放了。

可以用宏的方式来解决这个问题:

#define GUARD(p) std::shared_ptr<void> p##p(p, [](void *p){release(p);})

//使用时
void* p = GetHandle()->Create();
GUARD(p);  //安全

也可以用unique_ptr来管理第三方的内存:

#define GUARD(p) std::unique_ptr<void> p##p(p, [](void *p){release(p);})

对于宏中的##,其实也很好理解,就是将##前后的字符串连接起来

#define GUARD(p) std::shared_ptr<void> p##p(p, [](void *p){release(p);})

//使用时
void* p = GetHandle()->Create();
GUARD(p);  //安全
//会有一个std::shared_ptr<void> pp的智能指针,不信就进行测试。原因去找刚才的#define中有p##p
std::cout << pp.use_count() << std::endl;

为了验证原作者的这些,写一些demo来帮助理解,也有利于更好掌握:
创建一个Base类:
Base.h文件中:

#pragma once
class Base
{
public:
	Base();
	~Base();

	void print();
};

Base.cpp文件中:

#include "Base.h"
#include <iostream>

Base::Base()
{
	std::cout << "Base constructor" << std::endl;
}

Base::~Base()
{
	std::cout << "Base desctructor" << std::endl;
}

void Base::print()
{
	std::cout << "print something" << std::endl;
}

在main.cpp中:

#include "Base.h"
#include <memory>
#include <iostream>

#define GUARD(p) std::shared_ptr<Base> p##p(p, [](Base*p){release(p);})

Base* create()
{
	return new Base();
}

void release(Base* base)
{
	delete base;
}

std::shared_ptr<Base> Guard(Base *p)
{
	 std::shared_ptr<Base> sp(p, [](Base*p) {release(p); });
	 return sp;
}

int main()
{
	{
		Base* p = create();
		
		std::shared_ptr<Base> sp(p, [](Base*p) {release(p); });
		//Guard(p);

		//GUARD(p);
		//std::cout << "sp.use_count():" << sp.use_count() << std::endl;;
		p->print();
	}
	
	getchar();
	return 0;
}

此时的输出为:

Base constructor
print something
Base desctructor
【修改一】 当我们对main()中修改为:
int main()
{
	{
		Base* p = create();
		
		//std::shared_ptr<Base> sp(p, [](Base*p) {release(p); });
		Guard(p);

		//GUARD(p);
		//std::cout << "sp.use_count():" << sp.use_count() << std::endl;;
		p->print();
	}
	
	getchar();
	return 0;
}

运行结果:

Base constructor
Base desctructor
print something

发现这时候的p被提前释放了,print something已经是在Base类析构之后做的,此时已经出问题了。

【修改二】将main函数进行修改:
int main()
{
	{
		Base* p = create();
		
		//std::shared_ptr<Base> sp(p, [](Base*p) {release(p); });
		//Guard(p);

		GUARD(p);
		std::cout << "pp.use_count(): " << pp.use_count() << std::endl;;
		p->print();
	}
	
	getchar();
	return 0;
}

运行结果:

Base constructor
pp.use_count(): 1
print something
Base desctructor

果然如我们所想,一切正常。

参考:
#define中的 #与##

使用 FastAPI 构建高性能异步接口服务(含完整项目示例) python复制编辑python复制编辑= 1: raise HTTPException(status_code=404, detail="用户不存在")特性FastAPI 支持情况类型注解✅自动文档✅异步支持✅ORM 集成✅(推荐 SQLModel)性能✅ 极高FastAPI 是你构建现代化、高性能 Python Web 应用的首选框架! 阅读详情

相关推荐

车载毫米波雷达实战:用MATLAB复现DDMA-MIMO雷达的Empty-band算法(附代码解析)

本文详细介绍了车载毫米波雷达中DDMA-MIMO技术的实战应用,重点解析了Empty-band算法的原理与MATLAB实现。通过搭建仿真环境,文章深入探讨了发射天线通道解调与相位法速度解模糊两大核心难题的解决方案,并提供了完整的代码解析,为雷达算法工程师提供了从理论到实践的清晰指南。

hill8的博客 557

智能指针

智能指针是存储指向动态分配(堆)对象指针的类,用于生存期控制、能够确保在离开指针所在作用域时,自动正确的销毁动态分配的对象,防止内存泄露。 c++11提供了3种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需要引用头文件< memory>。 1. shared_ptr智能指针 shared_p...

一个人的旅行的博客 296

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 879

智能指针管理第三方库

本节记录一下通过智能指针来管理第三方库内存的分配。 在实际应用中会用到很多别人的lib,当该lib分配内存返回的指针一般是原始指针,其需要手动释放内存。这时候就可以使用智能指针来自动管理分配的内存了。 void* p = GetHandle()->Create(); //do something... GetHandle()->Release(p); 在实际试用中可能会忘记使用Release,故可以通过使用智能指针的方法来实现,防止出现内存泄露的情况。 //写成一个函数接口如下 st

misterdo的专栏 226

NFS服务器配置与autofs自动挂载

NFS服务器配置autofs自动挂载 环境: hostname ip OS server 192.168.220.138 centos7 client 192.168.220.139 centos7 一、NFS概述 NFS(Network File System)网络文件系统。最大功能就是通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 二、端口 [root@se...

DoloresOOO的博客 1026

Excel插件开发实战:从零封装一个带自定义Ribbon的.xlam工具包

本文详细介绍了如何从零开发一个带自定义Ribbon的Excel插件.xlam工具包。通过VBA和XML技术,读者将学习到插件架构设计、Ribbon界面定制、模块化开发以及企业级部署策略,帮助提升Excel自动化办公效率。

weixin_42531128的博客 514

C++ - 智能指针及其内存管理

C++ - 智能指针及其内存管理 智能指针 C已经有了指针了,为什么还要引入智能指针这种玩意? ​ 旧式C的指针使用存在两大问题: 没有自动回收机制。旧式指针使用完毕后必须手动释放,程序员若忘记释放就会导致内存浪费,而且浪费的内存难以察觉,甚至直到出现内存泄漏的程序将整个内存占满程序员才会察觉。 存在指针悬挂问题。对旧式指针的操作本质上就是对指向的内存操作,而不是指针本身的地址操作,删除指针就相当于释放内存,此时若有其他指针指向该内存,这些指针就会变成野指针,造成指针悬挂问题: //旧式指针

Tracker647的博客 920

将pytorch的权值矩阵量化为定点数补码并导入FPGA中

Xilinx FPGA实现LSTM算法时对ROM的初始化 将pytorch框架的权重矩阵以定点数补码的形式导入到FPGA中 文章目录Xilinx FPGA实现LSTM算法时对ROM的初始化1. pytorch框架中的LSTM2. 初始化一个RNN模型 3. 初始化ROM的coe文件格式 4. 将参数转换为补码,并且输出到coe文件 5. 配置一个ROM 6. 结论7. 代码 1. pytorch框架中的LSTM pytorch框架将LSTM算法中的八个权值矩阵连接成两个矩阵,假设要导入的LSTM网络的输

随缘分享 4527

c++ 笔记

todo 完整的介绍在C++中,内存分成5个区,他们分别是堆,栈,自由存储区,全局/静态存续区,常量存续区。(1)栈:内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数,函数调用后返回的地址。(为运行函数而分配的局部变量、函数参数、函数调用后返回地址等存放在栈区)。栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(2)堆:内存使用new进行分配,使用delete或delete[]释放。如果未能对内存进行正确的释放,会造成内存泄漏。

jiuweiC的博客 513

LeRobot 入门教程(九)使用 Android、iOS 手机控制机械臂

本指南详细介绍了如何使用iOS/Android手机远程控制机器人。内容包括:1)安装依赖(pip install leroobot[phone]);2)平台支持说明(iOS需HEBI Mobile I/O应用/Android用WebXR);3)手机方向校准方法;4)控制模式设定(按钮/手势);5)示例脚本使用(遥操作/数据记录/回放/策略评估);6)关键参数配置(运动学/安全限制/夹爪控制);7)故障排查方法。支持ROS2集成,提供URDF文件处理、逆向运动学计算和实时可视化功能,适用于物理机器人和仿真环境

2506_90492529的博客 1656

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

C++ 智能指针

在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当导致的。有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。C/C++什么是内存泄露,内存泄露如何避免?

chi's blog 1360

Planet explorer:免费获取高分辨率影像的网站

该软件提供了高质量的卫星图像和地形数据,用户可以使用该软件来查看地球上任何地方的详细地图信息,包括地形、道路、建筑物等。在接下来的30天里,你可以点击应用顶部的切换按钮,在新的和当前的应用之间进行切换。如果在你感兴趣的地区没有高分辨率图像,可以通过我们的SkySat卫星为你采购。如果你还没有与我们的50厘米图像合作,请在这里下载我们的高分辨率图像样本,或联系销售,在你的合同中增加任务访问。你可以在 "我的订单 "中订购你的数据以供下载。你也可以点击双方按钮,将图像的足迹锁定在地图上,以获得更好的。

此星光明博客 1678

C++智能指针

1. 智能指针的定义 智能指针就是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。 智能指针利用了RAII(资源获取即初始化)的技术,对普通指针进行封装,使得其行为像一个指针,但其实是一个对象。把资源放进对象内,用资源来管理对象,便是 C++ 编程中最重要的编程技法之一,即 RAII ,它是 "Resource Acquisition Is Initialization" 的首字母缩写。 智能指针的作用:方便堆内

liqingbing12的专栏 5997

Devexpress16.2.6破解工具

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

智能指针总结

1.什么是智能指针?智能指针是 C++ 中用于管理动态分配内存的工具,通过封装原始指针并利用 RAII(资源获取即初始化)机制,自动管理对象的生命周期,避免内存泄漏和悬垂指针问题。智能指针是 C++11 引入的现代化特性,定义在 <memory> 头文件中。2.C++为什么要引入智能指针?自动管理内存 避免内存...

qq_35485206的博客 1059

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++:智能指针之shared_ptr

1.智能指针C++中用new来动态分配内存,delete手动释放内存来达到动态管理内存的目的。因为保证在正确的时间释放内存是非常困难的,忘记释放内存就会产生内存泄露。为了更安全、便捷的使用动态内存,C++11标准库提供了新的智能指针类来管理动态内存。智能指针在行为上和普通的指针是一样的,只不过它可以保证内存在适当的时候自动释放。 新的标准库提供了两种智能指针(在头文件<memory>中),区

六天 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

解锁高效内存管理:C++智能指针的用法

在 C++ 编程中,内存管理是至关重要的一环。C++ 语言赋予了程序员对内存的高度控制权,但这也意味着需要谨慎地处理内存的分配与释放,否则很容易陷入诸如内存泄漏、悬空指针等棘手问题的泥沼。当我们使用new操作符手动分配内存时,必须时刻牢记在适当的时机使用delete来释放内存,稍有疏忽就可能导致内存泄漏,使程序占用的内存不断增加,最终耗尽系统资源。而如果对已经释放的内存进行访问,就会产生悬空指针,这可能引发程序崩溃或出现不可预测的行为。

深度Linux 1007

C++内存管理:智能指针与内存池

本文详细阐述了C++内存管理中的智能指针与内存池两种技术。智能指针通过自动管理内存,降低了内存泄漏的风险;而内存池则通过减少内存分配和释放次数、降低内存碎片等方式,提高了程序的性能。在实际编程中,合理使用智能指针与内存池,可以有效提高内存管理效率,避免内存泄漏。在未来,我们可以进一步研究智能指针与内存池的优化策略,如引入更高效的内存池算法、探索智能指针的更多应用场景等。这将有助于进一步提高C++程序的运行效率和稳定性。

2501_92489169的博客 399

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

智能指针是一种封装了普通指针的类,通过自动管理内存的分配和释放,简化了内存管理的过程。它们利用独占或共享所有权的概念,确保在对象不再使用时,自动释放相关资源,从而提高代码的安全性和可维护性。自动内存管理:避免手动调用delete或free,减少内存泄漏的风险。异常安全:在异常发生时,智能指针能够确保资源被正确释放。所有权管理:通过不同类型的智能指针,管理资源的独占或共享所有权,提高代码的表达力和安全性。掌握内存管理不仅是C/C++开发者的必备技能,更是提升编程能力的重要一步。

万物皆有灵 1322

C++:智能指针

在传统的 C++ 中,使用new分配内存后,程序员必须在适当的时机使用delete来释放这块内存。忘记delete会导致内存泄漏;过早delete(例如在还有指针指向该内存时就释放了)会导致悬空指针(Dangling Pointer),后续访问该指针会引发未定义行为(通常是程序崩溃);重复delete同一块内存也会导致严重错误。解决方案:智能指针(Smart Pointers)智能指针是 C++ 标准库(主要在<memory>头文件中)提供的类模板。它们的设计目标是自动化内存管理,特别是动态分配(

2301_80641185的博客 1139

Rust 智能指针

Rust 的智能指针提供了一种安全和自动化的方式来管理内存和共享所有权。智能指针是 Rust 中非常重要的一种数据结构,它们提供了一种安全、灵活和方便的内存管理方式,帮助程序员避免了常见的内存安全问题,提高了代码的可靠性和可维护性。智能指针是 Rust 安全性模型的重要组成部分,允许开发者编写低级代码而不必担心内存安全问题。通过智能指针,Rust 既保持了 C 语言的控制能力,又避免了其风险。

QQ672168的博客 1056

C++内存管理:智能指针与内存池技术

智能指针是一种模板类,它提供了类似于指针的接口,同时自动管理内存的分配和释放。智能指针的作用在于解决传统指针容易导致的内存泄漏、悬挂指针等问题。智能指针通过封装原始指针,并在析构函数中释放内存,实现了资源的自动管理。例如,和是C++11中引入的几种智能指针,它们各自具有不同的特性和用途。内存池技术是一种预先分配一大块内存,并在程序运行过程中动态分配和释放小块内存的方法。它通过减少内存分配和释放的次数,提高内存使用效率。

2501_92486745的博客 310

c++智能指针入门教程

搬运油管视频 通过代码示例讲解智能指针的概念。

weixin_39199083的博客 1542
上一篇: 编译链接muduo库中的echo例子
下一篇: Qt中使用lambda表达式
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值