Boost程序库完全开发指南:深入C++”准”标准库(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.7 pool

pool是最简单、最容易使用的内存池类,它可以返回一个简单数据类型(PODPOD是C++标准中的技术术语,是普通旧式数据(Plain Old Data)的缩写。)的内存指针。它位于名字空间boost,需要包含的头文件如下:

3.7.1 类摘要

pool的类摘要如下:

3.7.2 操作函数

pool的模板类型参数UserAllocator是一个用户定义的内存分配器,它实现了特定的内存分配算法,通常可以直接用默认的default_user_allocator_new_delete,它使用new[]和delete[]分配内存。

pool的构造函数可以接收一个size_type类型的整数requested_size,指示每次分配内存块的大小(而不是内存池的大小),这个值可以用get_requested_size()获得。pool会根据需要自动地向系统申请或归还使用的内存,在析构时,pool将自动释放它所持有的所有内存。

成员函数malloc()和ordered_malloc()的行为类似C中的全局函数malloc(),用void*型指针返回从内存池中分配的内存块,其内存大小为构造函数中指定的requested_size。如果内存分配失败,函数会返回0(空指针),不会抛出异常。malloc()从内存池中任意分配一个内存块,而ordered_malloc()则在分配的同时合并空闲块链表。ordered_malloc()带参数的形式还可以连续分配n块内存。可以用is_from()函数测试分配后的内存块是否是从这个内存池分配出去的。

与malloc()对应的一组函数是free(),free()用来手动释放之前分配的内存块,这些内存块必须是从这个内存池分配出去的(is_from(chunk)==true)。一般情况下,内存池会自动管理内存分配,不应该调用free(),除非你认为内存池的空间已经不足,必须释放已经分配的内存。

最后还有两个成员函数:release_memory()让内存池释放所有未被分配的内存,但已分配的内存块不受其影响;purge_memory()则强制释放pool持有的所有内存(不管内存块是否被使用)。实际上,pool的析构函数就是调用的purge_memory()。一般情况下,这两个函数不应该由程序员手动调用。

3.7.3 用法

pool很容易使用,它可以像C中的malloc()一样分配内存,然后随意使用内存。除非有特殊要求,否则不必对分配的内存调用free()释放,pool会很好地管理内存。例如:

因为pool在分配内存失败的时候不会抛出异常,所以实际编写代码时应该检查malloc()函数返回的指针,以防止空指针发生错误,不过通常这种情况极少出现:

关于pool没有更多的解释,因为它真的很容易使用,只需要注意一点:它只能作为普通数据类型(如int、double等)的内存池,不能将其应用于复杂的类和对象,因为它只分配内存,不调用构造函数,调用构造函数时,我们需要用object_pool。