智能指针被释放后的原始指针不可再用

智能指针之 scoped_ptr scoped_ptr是一个类似于auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_pstr获取了对象的管理权,你就无法再从它那里取回来。正如scoped_ptr(局部指针)名字的含义:这个智能指针只能在作用域里使用,不希望被转让。代码实现如下:template 阅读详情
#include <iostream>
#include <string>
#include <memory>

class MyClass
{
public:

	MyClass()
	{
		m_count = 1;
		m_strName = "xiao ming";
	}

	void Increase()
	{
		m_count++;
		std::cout << m_strName << " increase 1 " << std::endl;
	}

	void ChangeName()
	{
		std::cout << "ChangeName function()" << std::endl;
		m_strName = "xiao gang";
		std::cout << "The new name is  " << m_strName << std::endl;
	}

	std::string GetName()
	{
		return m_strName;
	}

	~MyClass()
	{
		std::cout << " Destructor" << std::endl;
	}

private:

	int m_count;
	std::string m_strName;
};

void Process(std ::shared_ptr<MyClass>& ptrParam)
{
	ptrParam->Increase();
	std::cout << ptrParam->GetName() << " enter Procees function" << std::endl;
}

void CallFunction()
{
	MyClass* pNewInstance = new MyClass();
	{
		std::shared_ptr<MyClass> ptrParam(pNewInstance);
		Process(ptrParam); //ptrParam释放管理的指针,但是pNewInstance并没有置为nullptr
	}
	if (pNewInstance == nullptr) {
		std::cout << "pNewInstance == nullptr" << std::endl;
	}
	else {
		std::cout << "pNewInstance != nullptr" << std::endl;
		pNewInstance->ChangeName();
	}
}

int main(int argc, char* argv[])
{
	{
		CallFunction();
	}
	
	system("pause");
	return 0;
}

运行结果:

xiao ming increase 1
xiao ming enter Procees function
~MyClass()
pNewInstance != nullptr
ChangeName function()

重点看这段代码:

MyClass* pNewInstance = new MyClass();
	{
		std::shared_ptr<MyClass> ptrParam(pNewInstance);
		Process(ptrParam); //ptrParam释放管理的指针,但是pNewInstance并没有置为nullptr
	}
	if (pNewInstance == nullptr) {
		std::cout << "pNewInstance == nullptr" << std::endl;
	}
	else {
		std::cout << "pNewInstance != nullptr" << std::endl;
		pNewInstance->ChangeName();
	}

ptrParam这个智能指针在其作用域结束后,会释放其管理的指针(计数为0时),看到~MyClass()已经执行了,但是没有将这个指针置为nullptr,后面的调用已经是出问题了的。

参考:https://www.cnblogs.com/lanzhi/archive/2012/03/23/6470827.html

智能指针是管家,原始指针是野马 std::unique_ptr 是 C++11 引入的一个智能指针类,它是一个 独占性所有权 的智能指针,意味着它总是唯一拥有指针所指向的对象。C++11引入了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。在 C++14 中,std::make_unique 被引入,它是创建 unique_ptr 的推荐方法。std::weak_ptr不拥有它所指向的对象,主要用于解决shared_ptr之间的循环引用问题。它通常与shared_ptr一起使用。 阅读详情

相关推荐

rust笔记9-引用与原始指针

Rust 中的指针类型和引用类型是理解其内存管理机制的关键部分。**`&` 引用**和 **`*` 原始指针**在底层原理上确实都可以认为是指针,它们都存储了某个内存地址,并指向该地址处的数据。

shanzhizi的专栏 754

C++智能指针及循环引用

目录: auto_ptr unique_ptr shared_ptr weak_ptr 循环引用问题 智能指针的原理: 智能指针的原理:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针指向的内存。智能指针本身是栈上的对象,所以当函数(程序)结束时会被自动释放掉。 1) auto_ptr:不支持复制和赋值,但复制和赋值时不提示错误,不能放入容器中。 2)unique_ptr:独享指针,不支持复制和赋值,但是赋值会编译出错。提供move方法。 3)shared_ptr:共享指针

m0_48643365的博客 1925

SAP SD POD 配置与 VLPOD 操作:3步解决发货10件开票7件的业务场景

本文详细解析了SAP SD POD功能在解决发货与开票数量差异中的应用,通过3步配置法实现精准匹配。重点介绍了POD核心逻辑、关键配置步骤及VLPOD操作技巧,帮助企业高效处理易损品运输等复杂场景,提升供应链管理效率。

weixin_30613343的博客 393

[C++高级部分]--智能指针

智能指针

下酒番陪绅士的博客 989

拯救者R7000P(2021)装双系统Ubuntu20.04 解决联发科MT7921无线网卡在Ubuntu中不能联网

拯救者R7000P(2021)装双系统Ubuntu20.04/Ubuntu18.04 电脑配置:联想拯救者R7000P CPU:AMD R7-5800H GPU:RTX3060-6G 内存:16GB 固态:500G(原装)+500(加装) 1.做系统盘(本文以Ubuntu20.04为例) 1.下载Ubuntu20.04镜像 直接去Ubuntu官网或者一些国内的镜像去下载都可以,这里给出一个网址https://ubuntu.com/download/desktop,根据需要下载自己学要的Ubuntu版本,后缀

qq_41108639的博客 1万+

基于ASP.NET+SQLServer的美妆网站的设计与实现

通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。

毕业设计大牛哥 1497

详解C++智能指针及交叉引用问题

技术交流qq:1032492413 技术交流VX:Chamfion

偶然i的博客 3490

别再只会用串口助手了!手把手教你用手机App调试HC-05蓝牙模块(STM32F103实战)

本文详细介绍了如何利用手机App调试HC-05蓝牙模块与STM32F103的无线连接,突破传统串口助手的限制。通过实战指南,开发者可以掌握移动性测试、实时监控和快速验证等高效调试技巧,优化蓝牙透传的稳定性和性能。

weixin_33670786的博客 427

智能指针的使用

文章目录独占型智能指针共享型智能指针线程安全shared_ptr引用计数AttributeMethod引用计数对象释放问题weak_ptrenable_shared_from_this 独占型智能指针 auto_ptr由于在拷贝和赋值时会转移指针权限,无法在STL容器中使用,在c++17中已经删除 unique_ptr为独占式智能指针,无法进行拷贝和赋值,这里我们利用RAII机制来实现一个简单的unique_ptr 这里使用泛型编程,unique_ptr内部保存T指针即可,在构造函数保存指针,析构函数

游学四方的博客 1724

ubuntu20.04安装nvidia-docker(解决有 Release 文件。 N: 无法安全地用该源进行更新,所以默认禁用该源错误)

然后想都不要想,nvidia+linux安装的东西,那肯定是不能安装成功的,恶毒的nvidia。按照nvidia官网给出的安装nvidia-docker流程来。在sudo apt-get update出现报错。然后再次update,发现还是会有一些警告类似于。,直接点击网页手动下载,发现下载成功!,注意会有安装先后顺序,安装给的提示就行。最后输入命令发现安装成功。然后替换掉里面的内容。直接不管,直接上命令。

weixin_48144140的博客 1235

pytorch搭建SSAE实现预测分类代码模板完整代码

pytorch搭建SSAE实现预测分类代码模板完整代码

323

释放智能指针 make_shared_看完这篇,别再说不会智能指针了

C++智能指针一、智能指针的作用上一篇介绍了内存池的原理和实现,详情请见内存池设计与实现;内存池可以帮助我们有效的对内存进行管理,智能指针可以很方便的管理指针,避免出现内存泄漏;智能指针的作用智能指针的作用:智能指针可以帮助我们避免在申请空间后忘记释放造成内存泄漏的问题;因为智能指针本身是一个类(后面也会自己实现一下),当出了类的作用域的时候,类会调用析构函数进行释放资源。所以智能指针的作用原理就...

weixin_39861905的博客 6246

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

本文介绍了如何使用 LangGraph 构建生产级 AI Agent,重点解析了 LangGraph 的核心设计、节点与边的实现方法论、生产级实现技巧以及性能优化策略。LangGraph 通过图结构抽象复杂 AI 工作流,核心组件包括节点、边、状态和检查点。节点通过 Python 函数封装原子业务逻辑,边通过条件分支实现动态工作流。生产级实现技巧包括状态管理、多会话控制和错误处理机制。性能优化策略涉及并行执行和缓存机制设计。文章还提供了旅行规划 Agent 的实战案例和常见问题解决方案,帮助开发者构建高效、

yonggeit的博客 3266

std::unique_ptr 的核心知识点

std::unique_ptr 是独占所有权的智能指针——同一时刻只有一个指针拥有对象,对象被销毁时自动释放内存。// unique_ptr独占所有权 不能拷贝,只能移动。// 自动释放 超出作用域自动 delete。// 异常安全 即使发生异常也会正确释放资源。

qq_55207368的博客 52

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 110

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【原始指针(*、malloc、new)和智能指针(shared_ptr、unique_ptr)的区别、理解和使用】

一、什么是原始指针(*、&)、什么是动态分配和释放内存(malloc和free、new和delete) 1.1无动态分配内存的使用方法 1.2动态分配内存使用方法 1.3为什么要动态分配内存? 二、智能指针(shared_ptr、unique_ptr)和原始指针区别、如何使用 2.1智能指针(shared_ptr、unique_ptr)和原始指针(*)区别 2.2shared_ptr、unique_ptr的区别

Jeff_Z_的博客 1066

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

c++智能指针详解

1.什么是智能指针 从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期。 在c++中,智能指针一共定义了4种: auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。 2.原始指针的问题 原始指

bitcarmanlee的博客 3万+

android 蓝牙通讯demo

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

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

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

C++智能指针与原始指针的性能博弈:何时该如何抉择?

以std::shared_ptr为例,它使用引用计数来管理对象的生命周期,每次复制或销毁std::shared_ptr对象时,都需要对引用计数进行原子操作,这会带来额外的CPU指令周期。然而,智能指针也带来了一定的性能开销。在多线程环境中,智能指针也能有效避免资源竞争和内存泄漏问题,虽然引用计数的原子操作会带来一定开销,但相比于手动管理内存可能出现的错误,这种开销是值得的。此外,在与C语言库进行交互时,原始指针也是必不可少的,因为C语言中没有智能指针的概念,使用原始指针可以避免类型转换带来的额外开销。

2501_91651722的博客 560

【Rust中级教程】1.2. 指针概览(下):原始指针及Rust里的各类指针

unsafe Rust提供了两种类似于引用的新型指针,它们叫做*原始指针*或者*裸指针*,英文是raw pointer。

A Rookie in San Domenico School 1478

C++ 原始指针、shared_ptr、unique_ptr分别在什么场景下使用

开发中一直萦绕我的一个困惑是:智能指针和原始指针什么场景怎么用? 现在终于有了答案: 1 两种指针的天赋:智能指针天生负责对象生命期管理;所以生命期对象全都由unique_ptr和shared_ptr来管理。 2 两种指针的天赋:原始指针天生不负责对象生命周期管理;所以使用动态对象均通过原始指针来使用(参考各种第三方库QT/BCG/OS API等等)。 ...

C++ 爱好者 make_it_simple888 7453

C++中Vector保存 原始指针和智能指针的析构问题

std::vector<std::shared_ptr > param; param中vector析构的时候,里面的智能指针会释放。Vector保存智能指针是可以释放智能指针 所指向的对象的 std::shared_ptr<std::vector> param; C++的Vector 保存原始指针 的时候 Vector 析构的时候是不会释放指针指向的堆对象, ...

TH_NUM的博客 3783

c++11之智能指针

前言:面试的时候被问到智能指针了,答的很糟糕,这几天重新学习了智能指针。下面是我对c++智能指针的理解与总结,希望能帮到大家,同时提升自己。 一,什么是智能指针 在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1.

qq_56673429的博客 2万+

【C++11】智能指针底层原理

C++11 引入的智能指针(Smart Pointers)是管理动态内存的工具,旨在自动释放不再使用的对象,防止内存泄漏。它们通过RAII(资源获取即初始化)技术封装原始指针,在对象生命周期结束时自动释放内存。

m0_70998129的博客 2175

深入理解 C++ 智能指针

智能指针和RAII(资源获取即初始化)是两个重要的概念,用于管理动态内存和其他资源。智能指针是一种自动管理内存的工具,通过引用计数或其他机制来确保资源的正确释放,从而避免内存泄漏和悬空指针的问题。RAII则是一种编程范式,利用对象的生命周期来管理资源的获取和释放,通过对象的构造函数获取资源,而在对象销毁时自动释放资源,从而确保资源的正确管理。本文介绍了C++中常见的智能指针类型,包括std::unique_ptr和std::shared_ptr,以及如何使用它们来避免内存泄漏和提高程序的安全性。

无敌岩雀的博客 1745
上一篇: qt ,使用tcp/ip协议网络传输数据时,字节序转换方法
下一篇: QT 使用QDataStream写入QByteArray数据时遇到的坑
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值