智能指针不是解决内存泄漏的万能良药

智能指针:防止内存泄漏的神器 智能指针是一个类对象,其行为类似于指针,但与原始指针的最大区别在于它拥有自动内存管理功能。智能指针的构造函数会分配内存,析构函数会释放内存,从而保证资源的正确释放。智能指针有多种实现方式,其中最常用的是shared_ptr和unique_ptr。当拥有unique_ptr的对象被销毁时,指针所指向的内存空间也会被释放。智能指针作为一种内存管理工具,能够解决这些问题,大大简化了程序员的编程工作。总结来说,智能指针是C++编程中非常重要的工具之一,它能够帮助程序员简化内存管理过程,有效避免内存泄漏等问题。 阅读详情

背景

最近在重构一个模块,模块中的接口有指针参数,我想把他改成智能指针,凡是接口要保持不变,就很难修改。
接口类似func(int ** p1),不知道怎么用shared_ptr代表。
然后我就进行了一系列骚操作!
从而也发现了智能指针的不当使用带来的内存泄漏和悬空指针的问题。

内存泄漏

内存泄漏(Memory
Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

悬空指针

在C/C++等语言中,悬空指针(Dangling
Pointer)指的是:一个指针的指向对象已被删除,那么就成了悬空指针。野指针是那些未初始化的指针。

示例1:错误的get()会带来悬空指针

void func(int **p1)
{
	std::Shared_ptr<int> sp=std::make_shared<int>(0);
	*p=sp.get();
}

int main()
{
	int *p1=new int(1);
	func(&p1);  //Error:悬空指针
	delete p1;
}

上面的代码就会出现悬空指针的问题。
原因是,C++的生命周期回收机制,在func()函数的智能指针sp的生命周期随着此函数的结束而结束,sp.get()方法返回的裸指针,所以不会增加引用计数,所以随着func()的结束,p1指向的sp的内存就被释放了,也就成了悬空指针。

示例2:智能指针没有初始化

int main()
{
	std::Shared_ptr<int> sp;
	int *p1 = sp.get();
	return 0;
}

错误原因:此时sp没有被初始化过,所以自然也就没有内存,p1也就没有内存!

OpenClaw本地部署教程 本文详细介绍了在Windows 11系统上部署OpenClaw与Ollama本地模型的完整流程。主要内容包括:硬件要求说明、Node.js环境配置、Ollama模型安装与定制(重点扩展上下文窗口至32768 tokens)、OpenClaw核心框架安装与对接、常见问题解决(如模型上下文窗口过小报错)以及可选技能扩展和飞书接入方案。部署全程约需1-2小时,强调使用备用设备或虚拟机以确保安全,并提供关键配置参数和排错命令。该方案实现了"数据不出门、推理本地化"的私有化部署目标。 阅读详情

相关推荐

树莓派5使用CSI摄像头 | 树莓派5接上CSI摄像头后命令行操作显示检测无设备

此系列用于记录树莓派5的一些操作,这篇文章讲述树莓派5如何使用CSI摄像头。

beyourself_he的博客 8796

智能指针

什么是智能指针? 智能指针就是智能(自动)的管理所指向的的内存资源的释放。因为我们自己开辟内存后,使用普通指针的时候最后常常忘了释放资源,导致内存泄漏! 智能指针本身并不是一个指针,他是一个类,重载了“ * ” “-&gt;“,能让我们像指针一 样去使用,最核心的思想就是RAII机制:获得资源立即初始化。定义一个类,在构造函数中实现资源的分配和初始化,析构函数中释放资源。这样一来,对象出了作用...

prerfect_cat的博客 841

链式中介效应结果解读:从Bootstrap置信区间到实践意义

本文深入解析链式中介效应结果的解读方法,从Bootstrap置信区间的应用到实践意义的阐述。通过实际案例展示如何分析总效应、直接效应和间接效应,并强调效应量评估的重要性。文章还提供了构建逻辑解释的三步法,以及敏感性分析和报告撰写的实用技巧,帮助研究者准确解读链式中介效应。

weixin_33690367的博客 718

C++ 智能指针

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

chi's blog 1361

技术解析:ChangeFormer——基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer模型在遥感变化检测中的创新应用,该模型基于Transformer架构和孪生网络(Siamese Network),显著提升了变化检测的精度和效率。通过详细的技术实现和实战经验分享,展示了其在建筑物变化、森林监测等场景中的卓越表现,为相关领域的研究和应用提供了有力工具。

weixin_29102619的博客 497

论文理解【LLM-OR】—— 【PaMOP】Guiding Large Language Models in Modeling Optimization Problem

针对 LLM 求解运筹优化任务,PaMOP 通过约束划分树分离子问题,实现复杂优化问题的分块建模,并结合求解器反馈与反向翻译一致性检查迭代纠错,降低子任务复杂度,提升可执行率与建模准确性。

佚失的诗篇 1007

智能指针不一定能杜绝内存泄漏

这句话的意思就是,智能指针虽好,但是也有概率出问题,毕竟C++没有java那种垃圾回收机制,所以。其中一种情况即使shared_ptr的循环引用,这里有个exp: http://blog.youkuaiyun.com/qq_26768741/article/details/52430368 类里的shared_ptr互相指向,导致无法释放内存。 #define _CRT_SECURE_NO_WARNI

baidu_34674626的博客 3098

QT触摸屏开发:如何通过重写事件处理实现精准按键长按检测

本文针对QT触摸屏开发中按键长按检测不精准的常见问题,深入剖析了传统信号机制失效的原因,并提供了通过重写事件处理函数(event)的解决方案。文章详细介绍了创建自定义TouchButton类、直接处理QTouchEvent以实现可靠长按检测的完整步骤与代码示例,并分享了进阶优化与避坑指南,帮助开发者实现跨平台一致的精准交互。

weixin_29207149的博客 96

智能指针的缺点以及智能指针引发的问题

再给我两分钟让我把记忆结成冰

比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)曾说过:如果你没看过这些博客,那么你的编程不会拥有智慧,你的代码不可能附有灵魂。 946

基于STM32L4XX、HAL库的 ATGM336H GPS定位模块驱动程序设计

/ 转换为km/h。// 定位状态: 0=无效, 1=GPS定位, 2=差分定位。// GPS解析数据。支持GPS/BeiDou/GLONASS/Galileo/QZSS多系统联合定位。// 回调函数(需要在HAL_UART_RxCpltCallback中调用)// 地面速度(km/h)// 海拔高度(m)

zhusl6688的博客 794

别把 ABAP 时间戳当数字算:TIMESTAMP / TIMESTAMPL 的语义、正确用法与项目级避坑指南

ABAP时间戳使用指南与常见陷阱 摘要:ABAP中的时间戳(TIMESTAMP/TIMESTAMPL)本质是UTC时间的数字表示,而非累计秒数。正确用法包括:直接比较时间戳顺序、使用CONVERT TIME STAMP进行时区转换、通过CL_ABAP_TSTMP计算时间差。关键注意事项:绝对不要对时间戳本身进行数学运算,否则会导致非法时间值。实际项目中需特别注意SAP Gateway的ETag处理、跨时区系统集成和CDS视图中的时间戳使用场景,避免将本地时间误存为UTC时间戳或在云迁移时产生时区问题。(14

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 347

C++智能指针

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

liqingbing12的专栏 5997

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C或C++不是C/C++

C++不是C/C++ 现在很多公司招程序员都是C/C++程序员。问:C/C++是一门什么语言呢?答:C中有C++, C++中有C。比如下面一段代码: int b[256]; memset(b, 0, sizeof(b)); for (int i = 0; i < 1000000; ++i) { for (size_t j = 0; j < 256U; ++j) {

白璐 | 产品经理 1195

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

shared_ptr的一些尴尬

shared_ptr在boost库中已经有多年了,C++11又为其正名,把他引入了STL库,放到了std的下面,可见其颇有用武之地;但是shared_ptr是万能的吗?有没有什么样的问题呢?本文并不说明shared_ptr的设计原理,也不是为了说明如何使用,只说一下在使用过程中的几点注意事项。 智能指针是万能良药? 智能指针为解决资源泄漏,编写异常安全代码提供了一种解决方案,那么他

lujun-cc的专栏 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Shared_ptr详解

shared_ptr在boost库中已经有多年了,C++11又为其正名,把他引入了STL库,放到了std的下面,可见其颇有用武之地;但是shared_ptr是万能的吗?有没有什么样的问题呢?本文并不说明shared_ptr的设计原理,也不是为了说明如何使用,只说一下在使用过程中的几点注意事项。用法 shared_ptr<int> sp(new int(10)); //一

喜欢恋着风 1592

OpenCV中使用C++11的智能指针避免内存泄漏问题

写过代码都知道,C#与Java都有自动的垃圾回收机制,可以很大程度上避免内存泄漏,但是C++开发对初学者最大的问题就是内存管理(初始化、分配与回收)。稍微不注意就会导致内存泄漏问题,比C#跟Java要难很多,被吐槽太多。所以C++11之后有了智能指针,用它你就可以不用担心内存管理问题,它可以自动完成内存管理与回收,最大程度避免内存泄漏问题。C++11中提供了三种不同类型的智能指针,分别是: 共享智能指针std::shared_ptr独占智能指针std::unique_ptr弱智能指针std::

lyk_ffl的专栏 828

C++ 智能指针初始化问题

class plugin { public: enum RunStatus { Running = 0 }; int test() { printf("test null shared ptr\n"); return 0; } }; int main() { std::shared_ptr<plugin> iter = NULL; std::cout << iter->t.

jike28的博客 477

《深度解析C++智能指针:如何避免99%的内存泄漏?》

《深度解析C++智能指针:如何避免99%的内存泄漏?》-摘要

veivzueh43724j的博客 209

防止内存泄漏的神兵利器 — 智能指针

防止内存泄漏的神兵利器!!!

知其然 知其所以然 1494

C++ 智能指针 unique_ptr 详解与示例

在本文中,我们将讨论由C++11提供的智能指针std :: unique_ptr&amp;amp;amp;lt;&amp;amp;amp;gt;。 unique_ptr &amp;amp;amp;lt;&amp;amp;amp;gt;是C++ 11提供的用于防止内存泄漏的智能指针中的一种实现。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。 ...

彼此当年少,莫负好时光 12万+

2020年字节跳动秋招C++精选面试题及答案(上)

1. C++智能指针如何解决内存泄露问题 1.shared_ptr共享的智能指针 std::shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。在最后一个shared_ptr析构的时候,内存才会被释放。 可以通过构造函数、std_make_shared辅助函数和reset方法来初始化shared_ptr: // 构造函数初始化 std::shared_ptrp ( new int(1) ) ; std::shared_ptrp2 = p ; // 对于一个未初始化的智能指针,

资料qun832218493 2814

内存泄漏检查工具

C++内存泄漏检查工具——Valgrind(–tool = memcheck) 在写大型C/C++工程时难免会发生内存泄漏现象,系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。 常见的内存问题一共七种:1. 动态内存泄露;2. 资源泄露,比如文件指针不关闭;3. 动态内存越界;4.数组内存越界;5.动态内存double free;6.使用野指针,即未初始化的指针;7.释放野指针,即未初始

qq_33271192的博客 2312

工程实践:到底要不要使用智能指针

前言 写了很久的“C with class”,在接触到智能指针的时候,都有点欣喜若狂了,想的是,这下子不用再为new/delete头疼了,也不用担心内存泄漏了,但事实证明我太天真了。 之前也学过modern cpp,甚至还总结过智能指针,但是看来没有实际的操作,空想还是太虚了! 本文仅作新手经验所记,必不全面 智能指针现状 auto_ptr: 跟98的前辈say goodbye unique_ptr: shard_ptr: 我这个人擅长模仿学习,看见别人的代码里用的都是shared_ptr,所以在一段时间

CodeBowl的博客 1137
上一篇: C++跨平台(四):ZeroMQ的简单示例
下一篇: 工程实践:到底要不要使用智能指针
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值