动态内存:allocator类

 一、简述

标准库中allocator类定义在头文件memory中,用于帮助将内存分配和对象的构造分离开来。

allocator<string> alloc;  //定义了一个名为alloc的对象
auto const p=alloc.allocate(n);  //分配n个未构造的内存,即为n个空string分配了内存。

二、用法介绍

常见操作总结如下:
allocator<T> a       定义了一个名为a的allocator对象,它可以为类型T的对象分配内存
a.allocate(n)         分配一段原始的、未构造的内存,这段内存能保存n个类型为T的对象
a.deallocate(p,n)    释放T*指针p地址开始的内存,这块内存保存了n个类型为T的对象,p必须是一个先前由allocate返回的指针,且n必须是p创建时所要求的大小,且在调用该函数之前必须销毁在这片内存上创建的对象。要求还蛮多的哈,这是因为在创建过程中我们分配的是最原始的内存,所以在释放内存时也是只能严格释放这片最原始的内存。

a.construct(p,args)  p必须是一个类型为T* 的指针,指向一片原始内存,arg将被传递给类型为T的构造函数,用来在p指向的原始内存上构建对象

a.destory(p)  p为T*类型的指针,用于对p指向的对象执行析构函数

三、使用默认的allocator

由于allocator将内存空间的分配和对象的构建分离,故使用allocator分为以下几步:

  1. allocator与类绑定,因为allocator是一个泛型类
  2. allocate()申请指定大小空间
  3. construct()构建对象,其参数为可变参数,所以可以选择匹配的构造函数
  4. 使用,与其它指针使用无异
  5. destroy()析构对象,此时空间还是可以使用
  6. deallocate()回收空间
#include <memory>
#include <iostream>
using namespace std;
//类Animal
class Animal
{
private:
	int num;
public:
#if 1        //即使为0,没有默认构造也是可以
	//默认构造函数
	Animal() : num(0)
	{
		cout << "Animal constructor default" << endl;
	}
#endif
	//初始化构造函数
	Animal(int _num) : num(_num)
	{
		cout << "Animal constructor param" << endl;
	}
	//析构函数
	~Animal()
	{
		cout << "Animal destructor" << endl;
	}
	//成员函数
	void show()
	{
		cout << this->num << endl;
	}
};

int main()
{
	//1. allocator是模板,类型为类Animal
	allocator<Animal> alloc;  
	//2. 指针对象a,申请指定大小空间
	Animal *a = alloc.allocate(5);   

	//3. construct第二个参数赋值
	alloc.construct(a, 1);
	alloc.construct(a + 1);
	alloc.construct(a + 2, 3);
	alloc.construct(a + 3);
	alloc.construct(a + 4, 5);

	//4. 使用指针
	a->show();
	(a + 1)->show();
	(a + 2)->show();
	(a + 3)->show();
	(a + 4)->show();

	//5. destory析构函数
	for (int i = 0; i < 5; i++)
	{
		alloc.destroy(a + i);
	}
	//对象销毁之后还可以继续构建,因为构建和内存的分配是分离的
	//6.
	alloc.deallocate(a, 5);

	cin.get();
	return 0;
}

 

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/81592044