C++的boost学习--内存管理

2024-08-24 22:48
文章标签 c++ 学习 内存 管理 boost

本文主要是介绍C++的boost学习--内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

boost库的内存处理
智能指针
1,scoped_ptr
不允许拷贝,赋值,只能在被声明的作用域中使用,不需要使用delete释放资源,自动释放资源,可以获得与原始指针同样的速度。
#include<iostream>
#include<boost\smart_ptr.hpp>
using namespace std;
void usageScopedPtr();
class Test{
public:
Test(const char*p){cout<<"new test"<<p<<endl;}
~Test(){cout<<"close"<<endl;}
};
int main(){
usageScopedPtr();


    return 0;
}
void usageScopedPtr(){
boost::scoped_ptr<string> sp(new string("what"));
cout<<*sp<<endl;
cout<<sp->size()<<endl;
boost::scoped_ptr<Test> spt(new Test("hi you"));
}
2,auto_ptr指针
用法几乎和scoped_ptr一样,区别就是auto_ptr会被转移,而scoped_ptr不会被转移,编译期会报错。
scoped_ptr只能在被声明的作用域使用,不能转移,在代码后期维护阶段很重要。
#include<iostream>
#include<boost\smart_ptr.hpp>
using namespace std;
void usageScopedPtr();
void usageAutoPtr();
class Test{
public:
Test(const char*p){cout<<"new test"<<p<<endl;}
~Test(){cout<<"close"<<endl;}
};
int main(){
usageScopedPtr();


    return 0;
}
void usageScopedPtr(){
boost::scoped_ptr<string> sp(new string("what"));
cout<<*sp<<endl;
cout<<sp->size()<<endl;
boost::scoped_ptr<Test> spt(new Test("hi you"));
cout<<spt.get()<<endl;
}
void usageAutoPtr(){
auto_ptr<int> at1(new int[10]);
boost::scoped_ptr<auto_ptr<int>> spa1(at1);
assert(at1.get() == 0);//断言自动指针已被转移,会被转移的auto_ptr,scoped_ptr的区别之一
//scoped_ptr不被转移
boost::scoped_ptr<int> scp2(new int[2]);
boost::scoped_ptr<boost::scoped_ptr<int>> ppp2(scp2);




}
注意:最后一行代码报错,因为我试图转移scoped_ptr




3,scoped_array
弥补了标准库中,没有指向数组的指针的遗憾
特点(1)构造函数必须是new[],
(2)没有重载*,->因为不是一个普通的指针
(3)析构函数使用的是delete[]
(4)没有begin,end
它和scoped_ptr区别就是它管理的是动态数组,而不是单个动态对象
4,shared_ptr
boost完全开发指南的作者强调这个指针是最重要的,在过去现在未来都是,是一个计数型智能指针,可以安全共享,
5,weak_ptr
shared_ptr的助手,不共享指针,不操作资源,弱指针
6,intrusive_ptr
因为shared_ptr指针能完成百分之九十九的工作了,所以不推荐使用intrusive_ptr指针
pool内存池库
#include<boost\pool\pool.hpp> 
容易使用,但是只能操作简单数据类型,如int,double等
object_pool,解决了这个问题。还有singleton_pool,pool_alloc,,,
#include<iostream>
#include<boost\smart_ptr.hpp>
#include<boost\pool\pool.hpp>
using namespace std;
void usageScopedPtr();
void usageAutoPtr();
void usageScopedArray();
void usagePool();
class Test{
public:
Test(const char*p){cout<<"new test"<<p<<endl;}
~Test(){cout<<"close"<<endl;}
};
int main(){
usagePool();
    return 0;
}
void usageScopedPtr(){
boost::scoped_ptr<string> sp(new string("what"));
cout<<*sp<<endl;
cout<<sp->size()<<endl;
boost::scoped_ptr<Test> spt(new Test("hi you"));
cout<<spt.get()<<endl;
}
void usageAutoPtr(){
auto_ptr<int> at1(new int[10]);
boost::scoped_ptr<int> spa1(at1);
assert(at1.get() == 0);//断言自动指针已被转移,会被转移的auto_ptr,scoped_ptr的区别之一
//scoped_ptr不被转移
boost::scoped_ptr<int> scp2(new int[2]);
}
void usageScopedArray(){
int *arr = new int[100];
boost::scoped_array<int> sa(arr);
fill_n(&sa[0],100,5);
sa[10] = sa[20]+sa[30];
}
void usagePool(){
boost::pool<> pl(sizeof(int));//一个int型的内存池
int *p = (int*)pl.malloc();//void*|强转成int*
assert(pl.is_from(p));
pl.free(p);//释放资源
for(int i=0;i<100;++i){
pl.ordered_malloc(10);//分配大量资源
}












智能指针最好用的是shared_ptr,内存池最好用的是object_pool,当然具体情况具体分析

这篇关于C++的boost学习--内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103822

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt