1.2.1 boost安装
推荐一键式安装
下载: 官网下载地址
(1)安装boost:解压后在Boost根目录下,执行./bootstrap.sh完毕后执行./b2 install,可以查看“/usr/local/include"以及”/usr/local/lib中是否有相应的头文件和库文件,来验证是否安装成功
(2)安装b2:解压后在Boost根目录下,执行cd tools/build/,执行./bootstrap.sh完毕后,执行./b2 install,b2会被默认安装到"/usr/local/bin目录下
(3)常用的b2命令
-
第二章主要讲的是timer库,个人认为不是很好用
-
内存管理
3.2 scoped_ptr:跟unique_ptr类似,但是其对于所有权更加严格,且智能在本作用域里使用,不能被转让。
scoped_ptrstd::stringsp(new string(“test”));// 构造一个scoped_ptr对象
assert(sp);//使用显式bool转型
assert(ap!=nullptr);//空指针比较操作
std::cout<<sp<<std::endl; //operatyor取字符串的内容
std::cout<size()<std::endl;//operatyor-取字符串的长度
3.3 shared_ptr
(1)类摘要
(2)构造函数
shared_ptr():
shared_ptr(Yp);
shared_ptr(shared_ptr const&r);
shared_ptr(Yp,D d);
(3)shared_ptr提供了一个工厂函数make_shared()消除显示的new调用
auto sp = make_sharedstd::string(“make_shared”);//创建string的共享指针
auto spv = make_shared<vector>(10,2);//创建vector的共享指针
assert(spv->size()==10);
typedef vector<shared_ptr>vs;// 一个持有shared_ptr的标准容器类型
vs v(10);//声明一个拥有10个元素的容器,元素被初始化为空指针
(4)应用于桥接模式和工厂模式
工厂模式:
#pragma once
#include <iostream>
#include <boost/smart_ptr.hpp>
// 定义抽象工厂类
class Abstract {
public:
virtual void f() = 0;
virtual void g() = 0;
protected:
virtual ~Abstract() = default;
};
class Impl :public Abstract
{
public:
Impl() = default;
virtual ~Impl() = default;
public:
virtual void f() {
std::cout << "class impl f" << std::endl;
}
virtual void g() {
std::cout << "class impl g" << std::endl;
}
};
boost::shared_ptr<Abstract>create() {
return boost::make_shared<Impl>();
}
int main()
{
auto p = create();
p->f();
p->g();
return 0;
}
(5)定制删除器
shared_ptr(Yp, D d);//第一个参数是被管理的指针,第二个则是告诉shared_ptr在析构时不要使用delete来操作指针p,而是用d来操作,即把delete p换成d§。
(6)指针转型函数
static_pointer_cast()
const_pointer_cast()
dynamic_pointer_cast()
(7)别名构造函数:
template
shared_ptr(shared_ptrconst&r,element_typep);
举例:
auto p1 = make_shared<std::pair<int,int>>(0,1);
shared_ptr<int> p2(p1, &p1->second);
p1 是一个指向 std::pair<int, int> 对象的 shared_ptr,其中这个对象包含了两个整数值,分别是 0 和 1。
p2 是一个指向整数的 shared_ptr,它的构造函数接受两个参数。第一个参数是一个 shared_ptr 对象,用于共享资源的所有权,即 p2 将共享 p1 所指向的资源。第二个参数是一个原始指针,它指向被共享资源中的某个成员。在这里,&p1->second 是取得 p1 所指向的 std::pair 对象中第二个元素的地址,即整数值 1 的地址。
因此,p1 指向 std::pair<int, int>(0, 1),而 p2 指向 p1 所指向的 std::pair 对象中的第二个整数值,即整数值 1。两者的引用计相同,但指向的内容不同。
(8)owner_less:基于所有权的比较函数
3.4 weak_ptr
没有重载operator*和->,不共享指针,不能操作资源,不会引起引用计数的增加或减少
3.5 pool
只能作为普通数据类型的内存池,不能将其应用于复杂的类和对象,因为它只分配内存,不调用构造函数;
3.6 object_pool
3.7 singleton_pool:可以理解为就是一个静态的pool
- 实用工具
4.1 noncopyable
class do_not_copy:boost::noncopyable{…};