C++函数中返回智能指针的裸指针问题

2023-11-06

注意:如果不是CSDN网站显示本篇文章,请于底部点击“阅读原文”来阅读本篇文章!

C++函数中返回智能指针的裸指针问题


作为一项案例分析下,C++函数中返回智能指针的裸指针问题。

要点

不要在函数中返回智能指针的裸指针出去!

原始代码

作用是获取一个插件的service。plugin->GetService()返回的是一个std::shared_ptr智能指针

Service *Test::GetService() const	// 函数声明
Service *Test::GetService() const	// 函数实现
{
    auto plugin = PluginManager::Instance()->GetPlugin(m_type);
    return plugin->GetService().get();
}

问题:如果使用智能指针的.get方法,获取一个裸指针返回,那么plugin->GetService()这里会得到一个临时智能指针变量,它生成临时变量时,计数器加1,函数返回后,这个临时变量会被销毁,此处计数器会减1,那么智能指针所指的内存会被释放,但是这里的释放不一定内存就没了,也不会马上就会被其他程序占用,所有此时这个get返回的地址就是一个野指针了。

写一个完整的测试代码,如下:

#include <iostream>
#include <string>

using namespace std;

class Test
{
public:
    Test() {
        cout<<"struct test"<<endl;
    }
    ~Test() {
        cout<<"destruct test "<<m_a<<" addr: "<<this<<endl;
    }

    string m_a {"sldj"};
    int m_b {2};
};

std::shared_ptr<int> GetInt(int num)
{
    return std::make_shared<int>(num);
}

int* GetIntTmp() {
    auto p = GetInt(10);
    std::cout<<p.use_count()<<endl;
    cout<<p<<" : "<<p.get()<<endl;
    return p.get();
}

std::shared_ptr<Test> GetTest()
{
    return std::make_shared<Test>();
}

Test* GetTestTmp() {
    auto p = GetTest();
    cout<<p<<" : "<<p.get()<<endl;
    return p.get();
}

int main(int argc, char *argv[])
{
    auto q = GetTestTmp();
    cout<<q<<endl;
    cout<<q->m_a<<endl;

    return 0;
}

输出打印如下,确实test的析构被调用了。
在这里插入图片描述

解决办法

1、 直接返回一个智能指针给外面用

std::shared_ptr<Service> Test::GetService() const
{
    auto plugin = PluginManager::Instance()->GetPlugin(m_type);
    return plugin->GetService().get();
}

2、或者使用std::move的方式移走,让指向的内存不被析构


微信公众号搜索:“上官宏竹”,关注并留言咨询,可接各类需求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++函数中返回智能指针的裸指针问题 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • 微软亚洲研究院实习生面试

    上周说到微软亚洲研究院 MSRA 一下就简称MSRA吧 网络面试我这边因为连不上而要重新安排面试 周五HR就给我电话约好今天中午1 00 3 00重新面试 于是提前做好各种准备 找了个拉ADSL的宿舍来上网 然后用了人家带摄像头的笔记本 还
  • B站创建视频分集播放列表

    上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1 打开B站 2 登录B站后 点击投稿上传视频 3 上传视频或把视频直接拖拽到页面里 4 点击上传第一个视频后页面下会出现一个 号的按钮 点击 继续上传 上传视频就会出现两个正在上传
  • 浅谈 Node.js 热更新

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 记得在 15 16 年那会 Node js 刚起步的时候 我在去前东家的入职面试也被问到了要如何实现 Node js 服务的热更新 其实
  • Tuple VS ValueTuple(元组类 VS 值元组)

    Tuple VS ValueTuple 元组类 VS 值元组 文章目录 Tuple VS ValueTuple 元组类 VS 值元组 Tuple 1 创建元组 2 表示一组数据 3 从方法返回多个值 4 用于单参数方法的多值传递 缺点 Va
  • 基于php的课程网站络管理系统的设计与实现

    摘 要 管理系统是根据课程网站的需求而设计和实现的 主要 用于实现课程系统办公人员对其办公系统内所有公务员进行管理 实现对员工信息的查询 录入 修改和删除 以及发布重要通知 最新信息和规章制度 通过 网上办公 无纸办公 大大提高办公效率 体
  • 电脑关机了,内存就没数据了吗?

    前言 大家好 我是周杰伦 提到网络攻击技术 你脑子里首先想到的是什么 是DDoS 是SQL注入 XSS 还是栈溢出 RCE 远程代码执行 这些最常见的网络攻击技术 基本上都是与网络 软件 代码 程序这些东西相关 这也好理解 计算机网络安全
  • Qt项目实战 杂谈一二:中文乱码事情小,处理不好头发少

    Qt开发者来说 特别是初学者 往往最头疼的是编码的问题 举个例子 1 控件上设置中文标签 发现显示出来是乱码 怎么解决 如果标签是常量字符串 含中文 怎么处理 如果标签是变量 且可能包含字符串 又咋处理 2 Qt应用与其他应用存在进程间交互
  • 浏览器无法打开网页,报错:DNS_PROBE_FINISHED_BAD_CONFIG

    症状 手机的正常上网 电脑连不上网 浏览器打不开网页 电脑 用ping命令不能发现主机 这时判断DNS解析有问题 用ping命令能发现主机 这时判断DNS解析没有问题 解决办法 方案1 ipconfig flushdns 方案2 ping
  • openwrt 软件安装依赖冲突

    今天在安装一个插件curl 安装失败了 报错内容如下 root R619AC co router tmp tmp opkg install curl Installing curl 7 68 0 1 to root Downloading
  • 使用react-markdown与markdown-navbar实现在线浏览markdown文件并自动生成侧边导航栏目录(react项目)

    使用react markdown与markdown navbar实现在线浏览markdown文件并自动生成侧边导航栏目录 react项目 在项目中需要一个需求 需要将markdown文件放在react前端项目中实现浏览器在线浏览 修改mar
  • Python爬虫框架Scrapy实例(爬取腾讯社招信息并保存为excel)

    前言 在学习python爬虫的时候 曾经爬取过腾讯社招的网站 很久很久没有写爬虫 心血来潮打算爬一个练手 想起之前爬过腾讯社招网站 打开一看网页变了 行动 重新写一遍 这个网站相对简单 做了简单测试没有设置反爬 比较适合初学者拿来练手 搜索
  • 利用webhook实现发送通知到Slack

    概要 最近办公交流应用 Slack在各团队里大行其道 非常火热 今天我们就来说说怎么用他的incoming webhook来做一些同步通知 发送通知给Slack 我们先来看看这种incoming webhook来发送通知的优势 团队成员可以
  • Vulhub Apache HTTPD 换行解析漏洞

    漏洞介绍 漏洞原理 运维人员为了解决 Apache 解析漏洞 会使用 配置 来限制匹配到的最后一个扩展名 这种方式虽然对多个扩展名的解析漏洞进行了防护 但是因为 的正则匹配规则可以将 php n 的扩展名同样可以匹配到 php 的规则 产生
  • Android使用ViewPager实现图片的轮播

    一 概述 在现在的Android项目中 首页图片轮播是随处可见的 今天我们看看如何实现 先看效果图 二 实现 先给大家看看最简单的布局文件
  • 架构之路_深度探索C++对象模型总结

    本文主要参照 深度探索C 对象模型 一书 一 关于对象 C语言中 数据和处理数据的操作 函数 是分开声明的 不支持数据函数之间的关联性 称之为程序性的 procedural 1 1 对象类型 C 中可以通过独立抽象数据类型实现 比如 cla
  • Unity 中场景切换

    Unity游戏开发中 单个Scene解决所有问题似乎不可能 那么多个Scene之间的切换是必然存在 如果仅仅是切换 似乎什么都好说 但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一些画面 动画表现出一些让玩家期待的东西
  • 禅道数据库异机访问,远程连接,navicat连接

    禅道数据库异机访问 远程连接 navicat连接 在使用xxj job做执行器时遇到的问题 数据库端口可以在这里修改 可以在这里修改 opt zbox app zentao config my php 禅道数据库官方文档 该链接也有修改数据
  • TP5+Fastadmin+Log日志

    Log 日志 1 引入类 use think Log 2 记录日志 通过Log类的record 方法 记录一条日志 Log record 这是一条普通日志 记录一个错误级别的日志 使用error 方法 Log error 这是一条错误日志
  • 2022届实习+秋招大厂面试经验(后端开发+java)

    个人情况 待补充 求职方向 后端开发 大致情况 20年底在字节实习到21年6月底 转正 21年7月初开始在阿里实习到8月中 转正 随后面试了百度 腾讯和美团 均拿到offer 中间有挂过 被其他部门又捞了 最终选择阿里 我是22年秋季毕业
  • C++函数中返回智能指针的裸指针问题

    注意 如果不是CSDN网站显示本篇文章 请于底部点击 阅读原文 来阅读本篇文章 C 函数中返回智能指针的裸指针问题 要点 原始代码 解决办法 作为一项案例分析下 C 函数中返回智能指针的裸指针问题 要点 不要在函数中返回智能指针的裸指针出去