C++ Boost智能指针详解
2013-12-22 00:20
330 查看
一、简介
由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行delete 的情况并不罕见。
用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr。你可能会想,如此多的智能指针就为了解决new、delete匹配问题,真的有必要吗?
二 使用
智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。
访问智能指针包含的裸指针则可以用 get() 函数。由于智能指针是一个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if (my_smart_object.get())。
智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。
三 具体用法
1.boost::shared_ptr:
#include <stdio.h>
#include <boost/shared_ptr.hpp>
class A {
public:
void print() {
printf("class A print!\n");
}
};
int main(int argc, char **argv) {
boost::shared_ptr<A> a1(new A());
a1->print();
}
由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行delete 的情况并不罕见。
用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr。你可能会想,如此多的智能指针就为了解决new、delete匹配问题,真的有必要吗?
二 使用
智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。
访问智能指针包含的裸指针则可以用 get() 函数。由于智能指针是一个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if (my_smart_object.get())。
智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。
三 具体用法
1.boost::shared_ptr:
#include <stdio.h>
#include <boost/shared_ptr.hpp>
class A {
public:
void print() {
printf("class A print!\n");
}
};
int main(int argc, char **argv) {
boost::shared_ptr<A> a1(new A());
a1->print();
}
相关文章推荐
- C++实验最后自我设计
- C++ 之 this 指针
- C++11: 新手易学,老兵易用
- C++笔记
- C语言总结之文件包含
- C语言使用JSON,cJSON库的使用
- c++ 中关于没有默认构造函数的成员类对象问题
- 谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)
- 分数的加减法——C语言初学者代码中的常见错误与瑕疵(11)
- C++编程规范之30:避免重载&&,||或,(逗号)
- C++编程规范之29:考虑重载,以避免隐式类型转换
- C++编程规范之28:优先使用++和—的标准形式。优先调用前缀形式
- C++编程规范之27:使用算术操作符和赋值操作符的标准形式
- C++编程规范之26:保持重载操作符的自然语义
- C++:多维数组的动态分配(new)和释放(delete)
- C++传值和传地址
- VC++6.0快捷键(引)
- C++头文件和源文件的关系
- C语言-编写你的第一个垃圾收集器
- c语言中的assert