boost之智能指针
内存问题永远是c++中讨论的重要话题
1.c98 auto_ptr的实现,auto_ptr的特点是始终只保持一个指针指向对象,若经过赋值或者拷贝之后原指针失效
#include <iostream> using namespace std; template<typename T>
class auto_ptr
{
public:
explicit auto_ptr(T* px = 0):m_px(px){}
auto_ptr(const auto_ptr& rhs):m_px(rhs.release())
{ }
auto_ptr& operator=(auto_ptr& rhs)
{
reset(rhs.release());
return *this;
}
T* get()
{
return m_px;
}
T& operator*()
{
return *m_px;
}
T* operator->()
{
return m_px;
}
T* release()
{
T* temp = m_px;
m_px = 0;
return temp;
}
T* reset(T* px)
{
delete m_px;
m_px = ptr;
}
~ auto_ptr(){delete m_px;}
private:
T *m_px;
}; int main()
{ return 0; }
2.boost库里的scoped_ptr和auto_ptr实现方式相同,不同点是scoped_ptr禁止赋值和拷贝。相同的缺点是可以返回原始指针,但是会让对象脱离智能指针的控制。、
scoped_ptr和auto_ptr都不能用作容器,原因不一样,auto_ptr转移语义,scoped_ptr则禁止复制。
3.shared_ptr是boost里最重要的指针,实现比auto_ptr要复杂的多,采用了引用计数和成员函数模板
下面说说shared_ptr存在的问题,
3.1.这个问题也是多线程存在的问题,线程安全,会进行重复析构。
#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost; int main()
{
string *pstr = new string("test program");
{
shared_ptr<string> sp1(pstr);
cout << sp1->size() <<endl;
}
shared_ptr<string> sp2(pstr);
cout << sp2->size() <<endl;
return 0; }
3.2循环引用,循环引用会造成内存泄漏,解决办法是将这种强引用关系转为弱引用关系,其中的一个成员变量使用weak_ptr<Parent> m_parent;
#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
class Parent;
class Children;
typedef boost::shared_ptr<Parent> parent_ptr;
typedef boost::shared_ptr<Children> children_ptr; class Parent
{
public:
children_ptr m_children;
}; class Children
{
public:
parent_ptr m_parent;
}; int main()
{
parent_ptr parent(new Parent);
children_ptr children(new Children);
parent->m_children = children;
children->m_parent = parent; return 0; }
boost之智能指针的更多相关文章
- 【原/转】【boost】智能指针使用规则以及介绍
智能指针机制跟Objective-C里面的retainCount引用计数有着相同的原理,当某个对象的引用计数为0是执行delete操作,类似于autorelease 初学者在使用智能指针时,很多情况下 ...
- 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- C++ 智能指针 boost::scoped_ptr分析
1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...
- C++智能指针详解
本文出自http://mxdxm.iteye.com/ 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最 ...
- 【转】C++ 智能指针详解
一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 ...
- c++ 中的8种智能指针[转]
一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 ...
- Qt 智能指针学习(7种指针)
Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...
- Qt 智能指针学习(7种QT的特有指针)
从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...
随机推荐
- TensorFlow学习笔记 补充1——InteractiveSession
InteractiveSession 大家有时候在阅读代码时会看见InteractiveSession而不是熟悉的Session,这是什么东东呢? 其实,它们只有一点不同..... Interacti ...
- 红茶一杯话Binder(传输机制篇_上)
红茶一杯话Binder (传输机制篇_上) 侯 亮 1 Binder是如何做到精确打击的? 我们先问一个问题,binder机制到底是如何从代理对象找到其对应的binder实体呢?难道它有某种制导装置吗 ...
- 28. Implement strStr()【easy】
28. Implement strStr()[easy] Implement strStr(). Returns the index of the first occurrence of needle ...
- tomcat的bin目录中startup.bat/tomcat.6.exe/tomcat6w.exe区别
一.tomcat6.exe 与 startup.bat的区别 1.两者都可以用于启动Tomcat tomcat6.exe则是必须将tomcat注册Windows服务之后才可以用于启动tomcat服务; ...
- SecurCRT 远程linux 输入中文及 oracle 查询出文号问题
一. 首先确认你的linux是否设置了支持中文 cat /etc/sysconfig/i18n 其中: LANG 变量是 language 的简称, 这个变量时决定系统的默认语言, 即系统菜单, 程序 ...
- IE6鼠标悬停Bug
当鼠标放置于某个文字链接之上,文字或文字背景改变为其他颜色或样式的效果是我们最经常见到的鼠标悬停效果.在CSS中,这个效果靠伪元素:hover来实现,只不过在文字链接中:hover被应用在了锚点元素& ...
- er图 画图工具
http://www.oschina.net/project/tag/83/db-model
- Android 缓存详解目录
1.http://www.cnblogs.com/lzrabbit/p/3734850.html 2.
- phpcs,phpmd,phan安装部署,phpstorm配置phpunit
git参考地址:https://github.com/YunhanTech/overview/blob/master/php/learn-road.md phpcs 安装 composer globa ...
- Mac下通过shell脚本修改properties文件
通过shell脚本替换属性文件中的某行记录 假设有如下属性文件 demo.properties user.name=test user.password=123456 ................ ...