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 ...
随机推荐
- UDP与TCP报文格式,字段意义
UDP报文 1.UDP有两个字段:数据字段和首部字段. 首部字段 首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节. 1)源端口:源端口号.在需要对方回信时选用.不需要时可 ...
- javaweb项目开发错误代码
HTTP状态码(HTTP Status Code) 一些常见的状态码为:200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应) ...
- rocketmq发送消息代码
DefaultMQProducer defaultMQProducer = new DefaultMQProducer(); defaultMQProducer.setProducerGroup(Co ...
- Creating Dialogbased Windows Application (3) / 创建基于对话框的Windows应用程序(三)Checkbox的应用、窗体置顶、设置图标 / VC++, Windows
创建基于对话框的Windows应用程序(三) —— Checkbox的应用.窗体置顶.设置图标 上一节创建的窗体应用程序中,我们用到了Button和StaticText这两个控件.这一节中我们将学习使 ...
- AutoLayout详解+手把手实战(转载)
首先说一下这篇博客虽然是标记为原创,但是事实并非本人亲自写出来的,知识点和例子本人花了一天各处查 找和整理最终决定写一个汇总的详解,解去各位朋友到处盲目查找的必要,因为不是转载某一个人的内容,故此不标 ...
- MII接口概念简述
MII: Medium Independent Interface 媒体独立接口,也称介质无关接口 RMII: Reduced MII 简化媒体独立接口 GMII: Gigabit Medium In ...
- RTT常用数据类型
RTT常用数据类型定义在rtdef.h中 /* RT-Thread basic data type definitions */ typedef signed char rt_int8_t; /**& ...
- va_list可变参数
可变参数函数实现 va_list,va_start,va_arg,va_end va可变参数意思,variable-argument. 1. 头文件及实现 linux中定义在gcc头文件中,stdar ...
- TBSchedule源码阅读2-TBScheduleManagerFactory 定时任务ManagerFactoryTimerTask
定时任务 : 主要功能:监听zookeeper状态,正常则this.factory.refresh(),异常则this.factory.reStart(); 1 正常情况this.factory.re ...
- selenium+testng+reportng+ant+jenkins集成日记
1.新建一个项目 2.编写测试脚本 3.配置ant的build.xml脚本 4.集成到jenkins,并运行 1.新建项目 注意jdk的版本要一致 eclipse Window --Prefer ...