Pool内存池: 只能开辟常规内存,数据类型为int,float,double,string等。

#include <iostream>
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp> using namespace std;
using namespace boost; int main(int argc, char const *argv[])
{
boost::pool<> pool(sizeof(int)); // 定义整数内存池
int *ptr[10] = { 0 }; // 定义指针列表 for (int x = 0; x < 10; x++)
{
ptr[x] = static_cast<int *>(pool.malloc()); // 开辟空间并转为指针
if (ptr[x] == nullptr)
cout << "分配空间失败" << endl;
} // 分别对内存空间赋值
for (int x = 0; x < 10; x++)
*ptr[x] = x; // 输出数据
for (int x = 0; x < 10; x++)
{
cout << "内存地址: " << &ptr[x] << " 数值: " << *ptr[x] << endl;
} getchar();
return 0;
}

objectPool 内存池: 该内存池支持对结构体,对象的分配与初始化。

#include <iostream>
#include <string>
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp> using namespace std;
using namespace boost; struct MyStruct
{
public:
int uuid;
string uname;
int uage;
string usex; MyStruct(int uuid_,string uname_,int uage_, string usex_)
{
uuid = uuid_; uname = uname_; uage = uage_; usex = usex_;
}
}; // 定义可变参数模板,用来实现接受三个以上的参数
template<typename P, typename ... Args> inline typename P::element_type* construct(P& p, Args&& ... args)
{
typename P::element_type* mem = p.malloc();
new(mem) typename P::element_type( std::forward<Args>(args)...);
return mem;
} int main(int argc, char const *argv[])
{
boost::object_pool<MyStruct> object;
auto ptr = object.malloc(); // 默认最多只能传递3个参数
//ptr = object.construct(1001,"lyshark",25); // 为构造函数传递参数
//cout << "姓名: " << ptr->uname << endl; // 接收四个参数写法
auto ref = construct(object, 1001, "lyshark", 24, "男");
cout << "姓名: " << ref->uname << endl; object.free(ref);
object.free(ptr); getchar();
return 0;
}

shared_ptr 智能指针:

#include <iostream>
#include <string>
#include <boost/smart_ptr.hpp> using namespace std;
using namespace boost; int main(int argc, char const *argv[])
{
// 基本的定义与赋值
boost::shared_ptr<int> int_ptr(new int);
*int_ptr = 1024;
cout << "指针: " << &int_ptr << " 数值: " << *int_ptr << endl; boost::shared_ptr<string> string_ptr(new string);
*string_ptr = "hello lyshark";
cout << "指针: " << &string_ptr << " 长度: " << string_ptr->size() << endl; // 拷贝构造的使用
boost::shared_ptr<int> shared_ptr(new int(10)); // 定义指向整数的shared
cout << "持有者: " << shared_ptr.unique() << endl; boost::shared_ptr<int>shared_copy = shared_ptr; // 实现拷贝
cout << "引用数: " << shared_ptr.use_count() << endl;
shared_ptr.reset(); // 关闭shared的使用 getchar();
return 0;
}
#include <iostream>
#include <string>
#include <boost/smart_ptr.hpp> using namespace std;
using namespace boost; class shared
{
private:
boost::shared_ptr<int> ptr;
public:
shared(boost::shared_ptr<int> p_) :ptr(p_){}
void print()
{
cout << "内部 计数: " << ptr.use_count() << " 数值: " << *ptr << endl;
}
}; // 自动拷贝一个对象,所以引用计数会+1
void print_func(boost::shared_ptr<int> ptr)
{
cout << "外部 计数: " << ptr.use_count() << " 数值: " << *ptr << endl;
} int main(int argc, char const *argv[])
{
boost::shared_ptr<int> ptr(new int(100)); // 定义整数指针
shared s1(ptr), s2(ptr); // 定义两个对象,并初始化 s1.print();
s2.print(); *ptr = 200;
print_func(ptr); s1.print();
s2.print(); getchar();
return 0;
}

make_shared 工厂函数: 工厂函数常用于初始化特定的指针数据的。

#include <iostream>
#include <string>
#include <vector>
#include <boost/smart_ptr.hpp> using namespace std;
using namespace boost; int main(int argc, char const *argv[])
{
// make_shared 工厂函数初始化
boost::shared_ptr<string> string_ptr = boost::make_shared<string>("hello lyshark");
cout << "初始化字符串: " << *string_ptr << endl; // 应用于标准容器中
typedef std::vector<boost::shared_ptr<int>> vector_ptr; // 定义标准容器类型
vector_ptr vec(10); // 定义拥有十个元素的容器 int x = 0;
for (auto pos = vec.begin(); pos != vec.end(); ++pos)
{
(*pos) = boost::make_shared<int>(++x); // 工厂函数初始化
cout << "输出值: " << *(*pos) << endl; // 输出数据(两次解引用)
} boost::shared_ptr<int> int_ptr = vec[9]; // 获取最后一个数值
*int_ptr = 100; // 修改最后一个数值
cout << "修改后: " << *vec[9] << endl; // 第二种输出方式(一次解引用完成)
x = 0;
for (auto& ptr : vec)
{
cout << "输出值: " << *ptr << endl;
} getchar();
return 0;
}

shared_ptr 桥接模式: 又称为PIMPI模式,仅对外部暴漏最小的细节,内部类实现用一个shared_ptr来保存指针。

#include <iostream>
#include <string>
#include <vector>
#include <boost/smart_ptr.hpp> using namespace std;
using namespace boost; class sample
{
private:
class impl;
boost::shared_ptr<impl> ptr; public:
sample();
void print();
}; class sample::impl
{
public:
void print()
{
cout << "impl print" << endl;
}
}; sample::sample() :ptr(new impl){} void sample::print()
{
ptr->print();
} int main(int argc, char const *argv[])
{
sample lsp; lsp.print(); getchar();
return 0;
}

markshare 实现工厂模式

#include <iostream>
#include <string>
#include <vector>
#include <boost/smart_ptr.hpp> using namespace std;
using namespace boost; // 定义基类 全部为虚函数
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()
{
cout << "class impl f" << endl;
} virtual void g()
{
cout << "class impl g" << endl;
}
}; // 工厂函数返回基类的shared_ptr;
boost::shared_ptr<abstract> create()
{
return boost::make_shared<impl>();
} int main(int argc, char const *argv[])
{ auto ptr = create();
ptr->f();
ptr->g(); abstract *q = ptr.get();
q->f();
q->g(); getchar();
return 0;
}

weak_ptr : 配合shared_ptr 作用在于协助shared_ptr 像旁观者一样观察资源的使用情况。

#include <iostream>
#include <string>
#include <vector>
#include <boost/smart_ptr.hpp> using namespace std;
using namespace boost; int main(int argc, char const *argv[])
{
boost::shared_ptr<int> ptr(new int(10));
boost::weak_ptr<int> weak(ptr); // 判断weak_ptr观察的对象是否失效
if (!weak.expired())
{
// 获得一个shared_ptr
boost::shared_ptr<int> new_ptr = weak.lock();
*new_ptr = 100;
} ptr.reset();
getchar();
return 0;
}

C++ Boost 内存池与智能指针的更多相关文章

  1. 重写boost内存池

    最近在写游戏服务器网络模块的时候,需要用到内存池.大量玩家通过tcp连接到服务器,通过大量的消息包与服务器进行交互.因此要给每个tcp分配收发两块缓冲区.那么这缓冲区多大呢?通常游戏操作的消息包都很小 ...

  2. Boost内存池使用与测试

    目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...

  3. 必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱

    必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱 十三.小心使用智能指针.         在前面几节已经很详细了介绍了智能指针适用方式.看起来,似乎智能指针很强大,能够很方便很安全的管理 ...

  4. c++动态内存管理与智能指针

    目录 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动释放相关联对象的内存 ...

  5. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  6. [6] 智能指针boost::weak_ptr

    [1]boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hp ...

  7. 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  8. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  9. 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

    一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...

  10. Boost智能指针-基础知识

    简单介绍 内存管理一直是 C++ 一个比較繁琐的问题,而智能指针却能够非常好的解决问题,在初始化时就已经预定了删除.排解了后顾之忧.1998年修订的第一版C++标准仅仅提供了一种智能指针:std::a ...

随机推荐

  1. Android WebView 踩坑日记,字体怎么突然变小了???

    背景 最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小. 一开始不知道是什么原因,通过二分法查找最近的提交,排查之后 ...

  2. 详解 SSL(二):SSL 证书对网站的好处

    在如今谷歌.百度等互联网巨头强制性要求网站 HTTPS 化的情况下, 网站部署 SSL 证书已然成为互联网的发展趋势.而在上一篇< 详解 SSL(一):网址栏的小绿锁有什么意义?>中,我们 ...

  3. Modern C++ Starter Kits Share

    初入 C++ 搬砖,在团队中开发实际上很少亲自从零开始搭建C++的完整项目,99%时候都是使用基础架构团队或者CI/CD团队搭建好的框架.这里分享几个配置C++项目的模版,它们一般会涉及三方库管理.格 ...

  4. JSP | application 对象详解 & 网站计数器实现

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 本篇学习自:C语言中文网,部分内容转载仅供学习使用. \[QAQ \] JSP applicat ...

  5. 动态给div赋值高,使页面高度100%

    import { ref, onMounted, onUnmounted, computed, nextTick } from 'vue' const boxRef = ref() const sea ...

  6. element-ui实现部分引用

    1.首先安装 babel-plugin-component组件: 2.修改babel.js配置 1 module.exports = { 2 presets: [ 3 '@vue/app', 4 [' ...

  7. P2196-DP【黄】

    清醒了一点后我又写了一道黄色DP题,做出来了,还行,开心不少了... 中途暴露出一些问题 1.深搜过程中既然用了二维数组,那么深搜时就应该用二维循环取最优解,而不是只从最后一行中进行一维循环取最优解. ...

  8. DOCKER本地仓库

    概述 随着docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker仓库的本地化应用. 试用了docker的本地仓库功能,简单易上手,记录下来以备后用. 环境 cen ...

  9. 基于AHB_BUS的eFlash控制器设计-软硬件系统设计

    eFlash软硬件系统设计 软硬件划分 划分好软硬件之后,IP暴露给软件的寄存器和时序如何? 文档体系:详细介绍eflash控制器的设计文档 RTL代码编写:详细介绍eflash控制器的RTL代码 1 ...

  10. [转帖]深入浅出分析LSM树(日志结构合并树)

    https://zhuanlan.zhihu.com/p/415799237 ​ 目录 收起 零.前言 一.LSM树数据结构定义 二.插入操作 三.删除操作 四.修改操作 五.查询操作 六.合并操作 ...