BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #99131同步于 2019/7/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【问题】使用shared_ptr来释放没有定义析构函数的类对象

gcl
2019/7/9镜像同步6 回复
附件(1.2KB) ex12_14.cpp 请教大佬,谢谢! 我看了c++primer12.1.4节,看不懂练习12.14的答案: 1.存在没有定义析构函数的类吗?如果没有自定义,不是有默认的析构函数吗?为什么12.1.4节中讲不是所有的类都有析构函数呢? 2.当使用智能指针管理的资源不是new分配的内存时,要传递一个删除器,在练习12.14中,函数f中的conn不是new分配的,在函数disconnect中只是输出了一些信息,那么函数disconnect是如何释放conn对象的呢?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
afly机器人#1 · 2019/7/12
默认析构函数是不会释放堆上面申请的内存的,但每个类都会有析构函数,栈空间的内存由系统自动释放
nuanyangyang机器人#2 · 2019/7/14
下次用make_shared<T>
hexiliu078机器人#3 · 2019/7/14
关于第一点,原文说的是:不是所有的类都有行为正确的析构函数。比如说没有对类申请的堆内存进行释放,就是行为不正确 关于第二点,disconnect函数并没有释放conn对象..之所以要传递删除器,是因为conn本身是栈上的对象,所以要覆盖deleter以避免shared_ptr的析构函数对其进行delete,conn本身会随着作用域的结束而销毁
gcl机器人#4 · 2019/7/14
【 在 hexiliu078 的大作中提到: 】 : 关于第一点,原文说的是:不是所有的类都有行为正确的析构函数。比如说没有对类申请的堆内存进行释放,就是行为不正确 : 关于第二点,disconnect函数并没有释放conn对象..之所以要传递删除器,是因为conn本身是栈上的对象,所以要覆盖deleter以避免shared_ptr的析构函数对其进行delete,conn本身会随着作用域的结束而销毁 谢谢你的回复,关于第一点我懂了,第二点我还是不明白disconnect函数的作用,它确实是代替了delete,可是它“必须能够完成对shared_ptr中保存的指针进行释放的操作”(原文),我不明白它是如何释放指针的? 还有一点,如图划线部分所示,没有使用智能指针时,为什么无法关闭c呢?我想c是一个局部对象,f退出后就不存在了?谢谢!
hexiliu078机器人#5 · 2019/7/14
【 在 gcl 的大作中提到: 】 : : 谢谢你的回复,关于第一点我懂了,第二点我还是不明白disconnect函数的作用,它确实是代替了delete,可是它“必须能够完成对shared_ptr中保存的指针进行释放的操作”(原文),我不明白它是如何释放指针的? : 还有一点,如图划线部分所示,没有使用智能指针时,为什么无法关闭c呢?我想c是一个局部对象,f退出后就不存在了?谢谢! 第一点看图 [upload=1][/upload] 在你一楼的代码里,f函数中的shared_ptr绑定的是一个栈变量(非动态内存),而shared_ptr析构时默认会对这个指向栈变量的指针进行delete操作,而这是未定义的行为。所以要覆盖默认的删除器,以免对这个栈变量进行delete 关于第二点,他的意思应该并不是说无法关闭c,而是说如果使用这个库的开发者忘了显式调用关闭c的函数,那么c就无法被关闭。前文说了这个库是要兼容C的,所以没有办法对connection定义析构函数,也就没有办法进行在销毁c之前关闭c代表的连接这样的操作。但把c封装到一个shared_ptr当中就可以实现了,因为可以定义删除器
afly机器人#6 · 2019/7/15
稳 【 在 hexiliu078 (绿杖白牛!) 的大作中提到: 】 : 第一点看图 : [upload=1][/upload] : 在你一楼的代码里,f函数中的shared_ptr绑定的是一个栈变量(非动态内存),而shared_ptr析构时默认会对这个指向栈变量的指针进行delete操作,而这是未定义的行为。所以要覆盖默认的删除器,以免对这个栈变量进行delete : ...................