头文件<memory>提供了内存管理;
一些和内存管理相关的模板类和函数, - allocator : 模板类 - raw_storage_iterator: 内存管理的迭代器 - get_temporary_buffer(): 返回临时缓冲区的指针; - return_temporary_buffer():释放掉临时缓冲区; - uninitialized_copy(): 从指定的源区域复制对象到未初始化的目标范围; - uninitialized_copy_n: 上面类似,只是有n个数值的限制; - uninitialized_fill():根据数据类型对数据进行数值填充; - uninitialized_fill_n():根据数据类型对数据进行数值填充n个;
定义:
template< class T > struct allocator; template<> struct allocator<void>;address()
pointer address ( reference x ) const noexcept; const_pointer address ( const_reference x ) const noexcept;说明: 返回x的地址。 在标准默认分配器中,这意味着返回&x。
allocate
pointer allocate (size_type n, allocator<void>::const_pointer hint=0);说明:
n: 要分配的元素数(每个大小sizeof(value_type))。hint: 默认为0,被用来改善实现的性能,如果不为0,该值可以用作通过在指定的附近分配新块来提高性能的提示;返回值:指向存储块中初始元素的指针。deallocate
void deallocate (pointer p, size_type n);说明:
释放先前分配给成员分配但尚未发布的存储块。数组中的元素不会被对该成员函数的调用所破坏。p: 指向内存的指针n:从p开始截取n个元素;max_size
size_type max_size() const noexcept;说明: 返回allocate开辟内存指定的内存大小;
construct
template <class U, class... Args> void construct (U* p, Args&&... args);说明: 在p指向的位置构造一个元素对象。使用不定的参数进行初始化;
destroy
template <class U> void destroy (U* p);说明: 1. 销毁p所指向的对象。请注意,这不会释放元素的存储; 2. 该函数使用U的析构函数,就好像使用了以下代码: p->~U()
原型:
template <class OutputIterator, class T> class raw_storage_iterator : public iterator<output_iterator_tag,void,void,void,void> { protected: OutputIterator iter_; public: explicit raw_storage_iterator (OutputIterator x) : iter_(x) {} raw_storage_iterator<OutputIterator,T>& operator* () { return *this; } raw_storage_iterator<OutputIterator,T>& operator= (const T& element) { new (static_cast<void*>(&*iter_)) T (element); return *this; } raw_storage_iterator<OutputIterator,T>& operator++ () { ++iter_; return *this; } raw_storage_iterator<OutputIterator,T> operator++ (int) { raw_storage_iterator<OutputIterator,T> tmp = *this; ++iter_; return tmp; } };说明:
使用参数x初始化迭代器的值;*操作符 返回元素;赋值运算符= 使用参数构造一个值,返回迭代器的引用;++操作符使迭代器前进,返回的引用有区别;例子:
#include <iostream> #include <string> #include <memory> #include <algorithm> int main() { const std::string s[] = {"This", "is", "a", "test", "."}; std::string* p = std::get_temporary_buffer<std::string>(5).first; std::copy(std::begin(s), std::end(s), std::raw_storage_iterator<std::string*, std::string>(p)); for(std::string* i = p; i!=p+5; ++i) { std::cout << *i << '\n'; i->~basic_string<char>(); } std::return_temporary_buffer(p); }输出为:
This is a test .说明: 1. 获取临时缓冲区的指针,该缓冲区必须存储n个相邻的元素; 2. 返回一个pair对象,first为指向缓冲区的指针,second为缓冲区容量;
说明:
释放p指向的缓冲区;缓冲区应该是最初由get_temporary_buffer分配的内存;说明: 范围[first,last)内的元素复制到一个未初始化的内存区开始在result。使用拷贝构造函数拷贝元素到未初始化的区域.
说明: 范围内[first,first+count]的元素复制到一个未初始化的内存区开始在result。使用拷贝构造函数拷贝元素到未初始化的区域.
说明: 复制给定值value到一个未初始化的范围[first, last)内存区域;
说明: 将first开始的区域填充count个value值;