首页 > 其他分享 >关于智能指针的一些疑问/

关于智能指针的一些疑问/

时间:2024-09-04 23:35:46浏览次数:8  
标签:temp iFmtCtx errbuff nullptr 智能 指针 ptr 疑问

首先先来一段代码,说明我的自主删除器

template <typename T>
class FFmpegDeleteer {
public:
  void operator()(T* ptr) const {
    if (ptr) {
	  delete ptr;
	}
  }
};
template<>
class FFmpegDeleteer<AVFormatContext> {
public:
  void operator()(AVFormatContext* ptr) const{
	if (ptr) {
	  if (ptr->pb) {
	    avio_closep(&ptr->pb);
	  }
          avformat_free_context(ptr);
	}
  }
};

然后当我采用这样子的初始化智能指针方式时候,程序没有内存问题:

std::shared_ptr<AVFormatContext> iFmtCtx=std::make_shared<AVFormatContext>();
AVFormatContext* temp_iFmtCtx = nullptr;	//不能取智能指针包裹的指针的地址,因为其返回的是一个临时值(右值)
auto res_1 = avformat_open_input(&temp_iFmtCtx, LOCALFILE, NULL, NULL);
if (res_1 < 0) {
	char errbuff[AV_ERROR_MAX_STRING_SIZE];
	av_strerror(res_1, errbuff, sizeof(errbuff));
	av_log(nullptr, AV_LOG_ERROR, "Error:%s\n",errbuff);
	return;
	//exit(-1);智能指针不会执行析构函数,因为程序会强行终止,不回收栈了
}
iFmtCtx.reset(temp_iFmtCtx, FFmpegDeleteer<AVFormatContext>());
temp_iFmtCtx = nullptr;

而当我采用这样子的初始话方式的时候就出现内存问题

std::shared_ptr<AVFormatContext> iFmtCtx(NULL, FFmpegDeleteer<AVFormatContext>());
AVFormatContext* temp_iFmtCtx = nullptr;	//不能取智能指针包裹的指针的地址,因为其返回的是一个临时值(右值)
auto res_1 = avformat_open_input(&temp_iFmtCtx, LOCALFILE, NULL, NULL);
if (res_1 < 0) {
	char errbuff[AV_ERROR_MAX_STRING_SIZE];
	av_strerror(res_1, errbuff, sizeof(errbuff));
	av_log(nullptr, AV_LOG_ERROR, "Error:%s\n",errbuff);
	return;
	//exit(-1);智能指针不会执行析构函数,因为程序会强行终止,不回收栈了
}
iFmtCtx.reset(temp_iFmtCtx, FFmpegDeleteer<AVFormatContext>());
temp_iFmtCtx = nullptr;

仅仅只是将

std::shared_ptr<AVFormatContext> iFmtCtx=std::make_shared<AVFormatContext>();

换成

std::shared_ptr<AVFormatContext> iFmtCtx(NULL, FFmpegDeleteer<AVFormatContext>());

就出现内存问题了,这个问题非常有趣

标签:temp,iFmtCtx,errbuff,nullptr,智能,指针,ptr,疑问
From: https://www.cnblogs.com/LLJR/p/18397521

相关文章

  • 学习使用双指针
    ​​......
  • 人工智能是什么,核心原理以及技术学习
    大家好,今天给大家介绍人工智能是什么,核心原理以及技术学习,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。人工智能(ArtificialIntelligence,简称AI)是指通过计算机系统以及算法来模拟、延伸和扩展人类智能的一门技术......
  • 人工智能该如何学习?学习路线附上
    大家好,今天给大家介绍人工智能该如何学习?学习路线附上,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。学习人工智能是一个系统而全面的过程,涉及多个领域的知识和技能。以下是一个详细的人工智能学习路线,旨在帮助初......
  • 【人工智能】分布式网络介绍
    一、分布式网络概述        分布式网络,这种计算机网络架构,以其独特的去中心化特性,将数据、服务和应用分布在多个物理位置的节点上,从而构建出一个高效、灵活且强大的网络系统。在这样的网络中,不存在一个单一的控制中心,每个节点都可能承担着数据处理和存储的任务,这种设......
  • 从Deepfake事件透视:人工智能如何重塑安防监控的未来
    近年来,随着人工智能技术的飞速发展,特别是深度伪造(Deepfake)技术的出现,引发了社会各界的广泛关注与讨论。Deepfake技术通过深度学习算法,将个人的声音、面部表情及身体动作拼接合成虚假内容,其效果可以达到以假乱真的程度,被形象地称为“音视频领域的PS技术”。然而,这一技术在带来娱乐、......
  • PLC结构化文本(ST)——指针和引用(Pointer&Reference)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——指针和引用(Pointer&Reference)指针的定义指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。---C++指针|菜鸟教程......
  • 直面女性心理健康现状,数业智能心大陆助你应对情绪困扰
    女性的心理健康与社会和文化环境中所承受的压力紧密相关。全球研究显示,女性抑郁障碍的发病率约为男性的两倍。心理学家詹姆士·杜布森指出,女性抑郁情绪可能源自多种生活压力,包括自尊缺失、时间压力、婚姻孤独、经济困难等。在我国,一些女性仍面临家庭暴力、职场性别歧视等问题,这些......
  • 从Deepfake事件透视:人工智能如何重塑安防监控的未来
    近年来,随着人工智能技术的飞速发展,特别是深度伪造(Deepfake)技术的出现,引发了社会各界的广泛关注与讨论。Deepfake技术通过深度学习算法,将个人的声音、面部表情及身体动作拼接合成虚假内容,其效果可以达到以假乱真的程度,被形象地称为“音视频领域的PS技术”。然而,这一技术在带来娱乐......
  • C++:this指针详解
    目录一、this指针 二、C++和C语言实现Stack对比一、this指针•Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调用Init和Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这里就要看到C++给了一个隐含的this指针解决这里......
  • 开源网安引领AIGC+开发安全,智能防护铸就软件安全新高度
    近日,国内网络安全领域知名媒体数说安全正式发布了《2024年中国网络安全市场100强》和《2024年中国网络安全十大创新方向》。开源网安凭借在市场表现力、资源支持力以及产品在AI方向的创新力上的优秀表现成功入选百强榜单,并被评为“AIGC+开发安全”典型厂商。开源网安已对全线软件安......