boost 智能指针使用
2017-07-18 16:13
281 查看
1、scoped_ptr
//scoped_ptr 不能作为容器的元素,因为不支持拷贝和赋值,因为拷贝和赋值函数是私有的。
//即,不存在 sp1 = sp2 这样的操作。
scoped_ptr<string> sp(new string("test"));
std::cout << *sp << std::endl;
std::cout << sp->size() << std::endl;
//sp is smart_ptr, not use delete for it.
2、scoped_array
//构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
//析构函数必须是delete[] 释放, 不是delete
//重载operator[],像数组一样的用下标访问元素
scoped_array<int> sa(new int[100]);
std::fill_n(&sa[0], 100, 5);
sa[10] = sa[20] + sa[30];
sa[0] = 10;
// *(sa + 1) = 20; //错误的用法,因为重载operator[], 不支持数组首地址+N的方式访问数组元素
3、shared_ptr
//shared_ptr 是线程安全的, 一个shared_ptr可以被多个线程安全读取
shared_ptr<int> spi(new int(10));
shared_ptr<string> sps(new string("smart"));
typedef vector<shared_ptr<int>> vs; //一个持有shared_ptr的标准容器
vs v(10); //声明一个10元素的容器, 初始化为空指针
int i = 0;
for (auto iter = v.begin(); iter != v.end(); ++ iter)
{
(*iter) = make_shared<int>(i++); //应该试用工厂函数来消除对new的大量使用, 可接受10多个参数,参数将传递给类型T的构造函数,创建一个shared_ptr<T>对象并返回
std::cout << *(*iter) << ",";
}
std::cout << std::endl;
//eg;
shared_ptr<std::string> spFac = make_shared<std::string>("make_shared");
shared_ptr<vector<string, int>> spVec = make_shared<vector<string, int>>("string", 10);
/*有两种方法将shared_ptr用于容器
1、 将容器作为shared_ptr的管理对象, 如shared_ptr<List<T>>,使容器可以被安全的共享,用法与普通shared_ptr相同。 如 shared_ptr<int> pp = v[9];
2、 将shared_ptr作为容器的元素,如vector<shared_ptr<int>>
*/
shared_ptr<void *>(); //shared_ptr可以存储void*类型指针
4、shared_array
/构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
//析构函数必须是delete[] 释放, 不是delete
//重载operator[],像数组一样的用下标访问元素
int * pI = new int[100];
shared_array<int> saa(pI);
shared_array<int> saa2 = saa;
saa[0] = 10; //shared_array 重载operator[]
assert(saa2[0] == 10);
//scoped_ptr 不能作为容器的元素,因为不支持拷贝和赋值,因为拷贝和赋值函数是私有的。
//即,不存在 sp1 = sp2 这样的操作。
scoped_ptr<string> sp(new string("test"));
std::cout << *sp << std::endl;
std::cout << sp->size() << std::endl;
//sp is smart_ptr, not use delete for it.
2、scoped_array
//构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
//析构函数必须是delete[] 释放, 不是delete
//重载operator[],像数组一样的用下标访问元素
scoped_array<int> sa(new int[100]);
std::fill_n(&sa[0], 100, 5);
sa[10] = sa[20] + sa[30];
sa[0] = 10;
// *(sa + 1) = 20; //错误的用法,因为重载operator[], 不支持数组首地址+N的方式访问数组元素
3、shared_ptr
//shared_ptr 是线程安全的, 一个shared_ptr可以被多个线程安全读取
shared_ptr<int> spi(new int(10));
shared_ptr<string> sps(new string("smart"));
typedef vector<shared_ptr<int>> vs; //一个持有shared_ptr的标准容器
vs v(10); //声明一个10元素的容器, 初始化为空指针
int i = 0;
for (auto iter = v.begin(); iter != v.end(); ++ iter)
{
(*iter) = make_shared<int>(i++); //应该试用工厂函数来消除对new的大量使用, 可接受10多个参数,参数将传递给类型T的构造函数,创建一个shared_ptr<T>对象并返回
std::cout << *(*iter) << ",";
}
std::cout << std::endl;
//eg;
shared_ptr<std::string> spFac = make_shared<std::string>("make_shared");
shared_ptr<vector<string, int>> spVec = make_shared<vector<string, int>>("string", 10);
/*有两种方法将shared_ptr用于容器
1、 将容器作为shared_ptr的管理对象, 如shared_ptr<List<T>>,使容器可以被安全的共享,用法与普通shared_ptr相同。 如 shared_ptr<int> pp = v[9];
2、 将shared_ptr作为容器的元素,如vector<shared_ptr<int>>
*/
shared_ptr<void *>(); //shared_ptr可以存储void*类型指针
4、shared_array
/构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
//析构函数必须是delete[] 释放, 不是delete
//重载operator[],像数组一样的用下标访问元素
int * pI = new int[100];
shared_array<int> saa(pI);
shared_array<int> saa2 = saa;
saa[0] = 10; //shared_array 重载operator[]
assert(saa2[0] == 10);
相关文章推荐
- Boost.Interprocess使用手册翻译之十一:所有权的智能指针(Ownership smart pointers)
- 【原/转】【boost】智能指针使用规则以及介绍
- 智能指针tr1::shared_ptr、boost::shared_ptr使用
- C++ 中boost::share_ptr智能指针的使用方法
- boost::share_ptr智能指针使用示例
- C++boost 智能指针 share_ptr的使用
- 智能指针tr1::shared_ptr、boost::shared_ptr使用
- boost中的智能指针的使用-------解决C++内存问题的最优方案
- boost::share_ptr智能指针使用示例
- boost::share_ptr智能指针使用示例
- boost::share_ptr智能指针使用示例
- boost asio 需要使用智能指针而不能使用普通指针的原因
- C++11 下使用 Boost.Serialization 库实现智能指针的序列化
- boost::share_ptr智能指针使用示例
- boost 智能指针的使用
- boost::shared_ptr 智能指针在项目中的使用
- Boost.Interprocess使用手册翻译之十一:所有权的智能指针(Ownership smart pointers)
- 使用C++标准类库的智能指针(源代码)
- 静态或者全局智能指针使用的注意几点
- Boost智能指针——shared_ptr