std::auto_ptr 不能赋值 简析

c++智能指针内存管理std::auto_ptr、 std::shared_ptr、std::weak_ptr make_shared 由于C++语言没有自动内存回收机制,程序员每次new出来的内存都要手动delete。程序员忘记delete,流程太复杂,最终导致没有delete,异常导致程序过早退出,没有执行delete的情况并不罕见。 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、... 阅读详情

今天试用了下std::auto_ptr, 第一次使用就出错了,尴尬啊,先还原现场:

 

类内声明:

Std::auto_ptr<Widget> m_pWgt;

 

类构造函数内赋值:

m_pWgt = new Widget;

 

大概就是这样,编译很顺利通过,一运行,蹦出个run-time error, 错误显示m_pWgt里无对象,于是trace到auto_ptr的赋值构造函数,查看了auto_ptr源码发现问题所在,现将部分源码列出如下:

 

 

 

从 auto_ptr 的源码可以得出语句 m_pWgt = new Widget; 的真实行为,首先使用 new 出来的指针初始化了一个 auto_ptr_ref 对象,然后将这个 auto_ptr_ref 对象赋值给 auto_ptr 对象,但是从赋值构造函数可以看出 auto_ptr_ref 内的指针指向的是 auto_ptr 内指针的地址,也就是个二级指针,试想一下,拿一个 new 出来的一级指针去初始化一个二级指针,然后将这个“二级指针”(实际是一级指针)里的解引用又赋值一个一级指针,效果如下图所示:

 

 

本来 new 出来的指针 ptr 指向 Widget 对象,然而经过 auto_ptr_ref 转换之后, auto_ptr 中的指针变成了 p , p 作为一个指针指向的位置是非法的,所以也就是为什么会 run_time error 了。

 

 

 

 

VS Code配置Java开发环境避坑指南:从JDK到Spring Boot插件全流程 本文详细介绍了在VS Code中配置Java开发环境的完整流程,涵盖JDK选择、环境变量配置、核心插件安装、构建工具优化及Spring Boot项目专项设置。特别针对常见问题提供避坑方案,帮助开发者快速搭建高效稳定的开发环境,提升Java和Spring Boot开发效率。 阅读详情

相关推荐

学习记录——SIMPACK生成轨道谱文件的方法

生成轨道谱文件的方法,可以用于实测轨道谱导入和自制轨道谱导入仿真

weixin_51965897的博客 7804

C++ auto类型推导

一、C++ auto类型推导 1、引入auto关键字的背景 在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int、char 等;但是在一些比较灵活的语言中,比如 C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体的类型,而是让编译器(或者解释器)自己去推导,这就让代码的编写更加方便。C++11 为了顺应这种趋势也开始支持自动类型推导了!C++11 使用 auto 关键字来支持自动类型推导。 2、auto

个人技术博客 1066

JQ8900语音播报模块在RT-Thread系统下的驱动移植与测试详解

本文详细讲解了如何在RT-Thread嵌入式操作系统中,为JQ8900语音播报模块进行驱动移植与功能测试。内容涵盖从获取驱动代码、配置Kconfig工程、编译烧录到核心代码解析的完整流程,并提供了基于串口通信的上电测试与问题排查方法,帮助开发者快速掌握在RT-Thread系统下集成外部模块的核心技能。

weixin_35677363的博客 593

C++ 使用auto实现函数指针的方法

语法背景 函数的地址就是函数名,使用函数指针可以实现返回值类型相同,参数相同,函数名不同的函数的调用,比如说: #include <iostream> void add(int a,int b) { std::cout<<"相加操作"<<std::endl; } void sub(int a,int b) { std::cout<<"相减操作"<<std::endl; } void (*fun)(int a,int b); int

手写不期而遇的博客 2712

VS Code/TRAE集成Cppcheck并启用MISRA规则

本文探讨了嵌入式开发中Cppcheck工具集成与MISRA规则检查的必要性。详细介绍了安装配置步骤:安装VSCode/TRAE、Cppcheck软件、配置插件参数、安装Python环境,并重点说明了MISRA规则文件的设置方法。通过完整的配置流程,实现了嵌入式开发环境下静态检查与安全标准的落地。

SDFangFang2025的博客 1282

用Python+ArcGIS分析厦门共享单车数据:5分钟搞定订单时长与距离分布的可视化

本文详细介绍了如何利用Python和ArcGIS Pro 3.x快速分析厦门共享单车数据,实现订单时长与距离分布的可视化。通过数据清洗、预处理和高级可视化技巧,揭示用户行为特征,为运营优化提供数据支持。文章还提供了环境配置、代码示例和业务洞察,帮助开发者高效完成数据分析任务。

weixin_28327051的博客 339

c++模板的问题解析-问题2

问题起源class Timer { public: Timer(){} };class TimeKeeper { public: TimeKeeper(const Timer& t){} TimeKeeper(){} std::string time; std::string get_time(){ return time; } friend std:

achao的专栏 1505

多摄像头同步技术:帧同步信号在Sensor与解串器间的传递机制

本文深入探讨了多摄像头系统中帧同步信号的两种核心传递机制:由解串器统一发号施令或由主Sensor作为“带头大哥”。文章对比了两种方案在同步精度、硬件复杂度、成本及适用场景上的差异,并提供了实战配置要点与调试心法,为车载环视、ADAS及工业检测等应用提供关键的技术选型与实施指导。

weixin_29193359的博客 435

为什么auto_ptr智能指针不能作为STL标准容器的元素

为什么auto_ptr不可以作为STL标准容器的元素 假如有这样的一段代码,是否能够运行? ? 1 2 3 4 5 6 7 8 9 int costa_foo() {     vector< auto_ptrint> > v(10);     

大灰狼的专栏 2382

晶晨S905L3S/S905L3SB芯片刷机实战:BL加载工具与线刷固件全解析

本文针对晶晨S905L3S/S905L3SB芯片电视盒子刷机时常见的2%失败问题,提供了两种核心解决方案。一是使用已集成特殊通信协议的专用版USB Burning Tool(如V2.2.5/V2.2.7),二是采用旧版工具配合独立的BootLoader加载工具。文章详细解析了两种方案的原理、操作步骤、固件选择及常见问题排查,旨在帮助用户成功完成刷机,让老旧设备焕发新生。

weixin_29238147的博客 1109

[Python] 为什么你的脚本明明没报错,却什么也没发生?

Python脚本运行后没报错却没结果?这是许多开发者遇到的棘手问题。文章分析了六种常见原因:代码未进入目标逻辑分支、输出路径错误、中间数据为空、异常被吞掉、异步操作未完成、运行了错误脚本版本。建议通过"过程可视化"排查,如打印关键变量、检查工作目录、验证数据状态等。职场中更应关注结果验证而非单纯代码执行,确保脚本真正解决问题。建立结果验证意识是从"会写代码"到"稳定交付"的关键转变。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 303

std::auto_ptr的原理及使用

使用auto_ptr作为成员变量,以避免资源泄漏。防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。auto_ptr解决这个问题

浴血重生-学习空间 5937

AI智能体面试实战与真题解析: 312+道面试题完整答案 (下篇)

本文覆盖220道基础八股文+92道项目面试题,涵盖Agent架构、RAG、工具调用、记忆系统、多智能体、大模型基础、工程化实践、Prompt工程9大模块,含完整代码实现和模拟面试剧本。

program哲学 302

【C++入门到精通】智能指针 auto_ptr、unique_ptr简介及C++模拟实现 [ C++入门 ]

这篇文章介绍了 C++ 中的两种智能指针:std::auto_ptr和std::unique_ptr。首先,文章简要介绍了它们的作用和使用示例。然后,对于std::auto_ptr,文章展示了一个简单的模拟实现,解释了每个函数的作用和实现原理。接着,文章介绍了更为严格的 std::unique_ptr,包括其特点、使用示例和模拟实现。对于模拟实现,文章详细解释了如何防止拷贝和赋值,并提供了两种不同的思路。整篇文章内容清晰明了,对于想要学习 C++ 动态内存管理的读者具有很好的参考价值。

Yawesh的博客 2727

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

浅谈智能指针工作原理(std::shared_ptr、std::unique_ptr、std::weak_ptr、std::auto_ptr)

智能指针,老有人会问关于对它的认识。为了很好的回答这个问题。对智能指针 std::shared_ptr、std::unique_ptr、std::weak_ptr和 std::auto_ptr进行分析。在此做一个总结,对于智能指针的分析告一段落。`智能指针总是八股文的一部分,与其记住它的特性,不如知道它的工作逻辑,推导出所以然。记性总是很差,为何不去理解它的原理,感受它的趣味。

qq_39884728的博客 1178

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++中std::auto_ptr的使用解析

前言 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。 用智能指针便可以有效缓解这类问题,本文主要讲解std::auto_ptr智能指针。 对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智...

夜风的博客 2350

visio安装包

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

C++ 11:std::auto_ptr介绍,以及boost::scoped_ptr

1 std::auto_ptr 1.1 auto_ptr介绍 智能指针能保证,无论在何种情况下,只要自己被摧毁,就一定连带释放其所指资源。auto_ptr是这样的一种指针:它是“它所指向的对象”的拥有者。auto_ptr要求一个对象只能有一个拥有者,严禁一物二主。不再需要delete,也不再需要catch了。不用担心忘掉delete动作,担心程序异常结束时内存遗失或者资源遗失,只...

zzhongcy的专栏 1058

深入理解C++智能指针:从std::auto_ptr到现代C++的演进

通过合理选择和使用这些智能指针,你可以编写出更安全、更高效的C++代码。std::auto_ptr 已经被废弃,不应该在新代码中使用。std::unique_ptr 是最轻量级且高效的智能指针,适用于单一所有权的情况。std::shared_ptr 提供了灵活的所有权管理和线程安全性,但在性能上有所牺牲,并需要注意循环引用的风险。std::weak_ptr 主要用来辅助std::shared_ptr,以避免循环引用问题。

evesmith520的博客 1254

深入剖析C++智能指针从std::auto_ptr到std::unique_ptr的演变与最佳实践

与auto_ptr仅支持delete操作不同,unique_ptr允许用户指定自定义删除器。这意味着它不仅可以管理由new分配的内存,还可以管理其他资源,如文件句柄(使用fclose)、Mutex锁等,实现了真正的资源管理通用化。

u011200601的博客 828

智能指针std::auto_ptr

auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个

享受开发技术,享受计算机科学 934

auto_ptr 与 shared_ptr 用法和区别总结

一、std::auto_ptr 被复制后,将失去原来所致资源的所有权;*auto_ptr在头文件<memory>中。 永不建立auto_ptr的容器 关于此可以看的Effective STL的条款8 因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。 首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不...

大隐隐于野 2019

深入解析C++智能指针从std::auto_ptr到std::unique_ptr的演进与最佳实践

unique_ptr`对自定义删除器的支持比`auto_ptr`更加灵活和高效。删除器的类型是`unique_ptr`类型的一部分(对于`unique_ptr`),但得益于EBO(空基类优化),使用函数指针或无状态的函数对象(如lambda表达式)作为删除器时不会带来额外的内存开销。这使得它不仅可用于管理内存,还可用于管理文件句柄(`FILE`)、套接字等需要特定释放操作的资源。

macjay226的博客 567

C++智能指针完全指南:从std::auto_ptr到现代智能指针实践

C++智能指针演进与使用指南 本文系统介绍了C++智能指针的发展历程和核心用法。首先分析了被废弃的std::auto_ptr的所有权转移缺陷,进而深入讲解三种现代智能指针:std::unique_ptr用于独占所有权场景,支持移动语义和自定义删除器;std::shared_ptr实现共享所有权,但需警惕循环引用问题;std::weak_ptr作为观察者指针打破循环引用。文章还对比了各类智能指针的性能开销,并给出工厂函数规范、前置声明优化等实践建议。现代C++智能指针遵循RAII原则,可以有效管理90%的内存

AlgoCraft 939

auto_ptr 基本用法

#include #include int main(){ double* pd = new double(77.77); std::cout << "*pd = " << *pd << std::endl; std::cout << "pd = " << pd << std::endl; // std::auto_ptr apd = p

生命不息, 战斗不止! 4831

C++——auto_ptr与unique_ptr

auto_ptr与unique_ptr的比较 先介绍unique_ptr(独占智能指针)参考爱编程的大丙 std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个 unique_ptr 赋值给另一个 unique_ptr。 示例: // 通过构造函数初始化对象 unique_ptr<string> ptr1(new string(“aaa”)); // error, 不允许将一个uni

勿在浮沙築高台 1125

std::auto_ptr简单使用

auto_ptr 为c++的智能指针,主要解决的问题是C++的内存泄露问题,但是本质的原因是智能指针的本质其实是一个栈对象,所以才能被自动回收,假如为堆对象的话,则需要程序员自己回收。 实例代码 头文件 #include "stdafx.h" class Samples{ public: Samples(); ~Samples(); void doing(); private:...

MusicMan 513
上一篇: wglShareLists使用简介
下一篇: 链接错误LNK2005
webScaler
博客等级 码龄20年 45粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值