多个非同源的shared_ptr管理对象引起double free
有多个不同源的shared_ptr管理对象时会出现多次释放对象,这里不同源是指多组间不是通过拷贝构造、复制等手段而来的,即几组shared_ptr是独立声明的。
#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<boost/enable_shared_from_this.hpp>
#include<boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
class test{
public:
void show(){
shared_ptr<test> one(this);//###1###带此符号的两处shared_ptr非同源会造成:这里的shared_ptr退出作用后就将管理的对象进行析构,而外层的shared_ptr对此全然不知,继续使用该对象,麻烦就来了...
cout<<"show()"<<endl;
}
~test(){
cout<<"~test"<<endl;
}
};
int main(){
shared_ptr<test> one(new test);//###1###
one->show();
shared_ptr<test> two=one;//拷贝一个shared_ptr
two->show();
return 0;
}
程序输出:
show()
~test
show()
~test //同一对象析构了两次
*** glibc detected *** ./two_shared_ptr_1: double free or corruption (fasttop): 0x000000000080b010 *** //double free
采用继承enable_shared_from_this,然后使用shared_from_this()可以解决这个问题
#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<boost/enable_shared_from_this.hpp>
#include<boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
class test:public enable_shared_from_this<test> {//继承
public:
void show(){
shared_ptr<test> one(shared_from_this());//采用shared_from_this()的shared_ptr是同源的
cout<<"show()"<<endl;
}
~test(){
cout<<"~test"<<endl;
}
};
int main(){
shared_ptr<test> one(new test);
one->show();
shared_ptr<test> two=one;
two->show();
return 0;
}
程序输出:
show()
show()
~test //正常析构
多个非同源的shared_ptr管理对象引起double free的更多相关文章
- .NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题
最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal.double.int.DateTime等非string类型数据时 ...
- c++智能指针(unique_ptr 、shared_ptr、weak_ptr、auto_ptr)
一.前序 什么是智能指针? ——是一个类,用来存储指针(指向动态分配对象也就是堆中对象的的指针). c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写 ...
- C++判断输入是否为double
C++判断输入是否为double 之前写过了Python如何判断输入字符串是否为数字,但是Python是弱类型语言,相比之下C++这种强类型语言判定难度更大. Python判断输入字符串是否为数字的方 ...
- JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
- JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
- 《Effective C++》第3章 资源管理(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- Effective Modern C++:03转向现代C++
07:在创建对象时注意区分()和{} 自C++11以来,指定初始化值的的方式包括使用小括号,等号,以及大括号: ); // initializer is in parentheses ; // ini ...
- 「C++ 」借来的资源,何如还的潇洒?
前言 本文的内容将专门对付内存管理,培养起有借有还的好习惯,方可消除资源管理的问题. 正文 所谓的资源就是,一旦用了它,将来必须还给系统.如果不是这样,糟糕的事情就会发生. C++ 程序内常见的资源: ...
- 【前端安全】JavaScript防http劫持与XSS
作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...
随机推荐
- mongo 安装
mongo 安装: 1.按照 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 安装 2.安装成功后创建用户 d ...
- 先声明再定义的必要性 .xml
pre{ line-height:1; color:#9f1d66; background-color:#cfe4e4; font-size:16px;}.sysFunc{color:#5d57ff; ...
- CListCtrl总结.xml
pre{ line-height:1; color:#d1653c; background-color:#000000; font-size:16px;}.sysFunc{color:#566d68; ...
- JS操作文件
) ; ; fso ); f1.Close(); // 读取文件的内容. // Response.Write("Reading file <br>") ...
- SQL 教程学习进度备忘
书签:跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1. “SQL select”底部的“ AD ...
- Page 16 Exercises 1.2.3 -------Introduction to Software Testing (Paul Ammann and Jeff Offutt)
Below are four faulty programs. Each includes a test case that results in failure. Answer the follow ...
- C#面向对象基础01
面向对象不是取代面向过程的类.对象."人"是类,"张三"是人这个类的对象.类是抽象的,对象是具体的.按钮就是类,某个按钮就是对象.对象可以叫做类的实例.类就像i ...
- HBase应用场景
适用场景 列族结构经常调整 高并发写入 结构化数据及半结构化数据 Key-Value存储 有序存储 固定集合(多版本) 定时删除记录(TTL) 不适用场景 事务 join,union,groupb ...
- [cocos2d-js]chipmunk例子(二)
; ; ; ; <<; var NOT_GRABABLE_MASK = ~GRABABLE_MASK_BIT; var MainLayer = cc.Layer.extend({ _bal ...
- First & First
First有记录则返回,否则返回null FirstOrDefault有记录则返回,否则NEW一个新的实体对象返回