前言:
//分配内存的一般方法
int *p2 = (int*)malloc(sizeof(int)*2);
std::cout << p2 << " " <<*p2 << std::endl;
std::cout << ++p2 << " " <<*p2 << std::endl;
std::cout << ++p2 << " " << *p2 << std::endl;
std::cout << "--------------new-------------" <<std::endl;
int *p3 = new int();//不加()将不会初始化
std::cout << p3 << " " <<*p3 << std::endl;
std::cout << ++p3 << " " << *p3 << std::endl;
std::cout << ++p3 << " " << *p3 << std::endl;
std::cout << ++p3 << " " << *p3 << std::endl;
输出结果:
--------------malloc-------------
0xe91aa0 13771920
0xe91aa4 0
0xe91aa8 15270224
--------------new-------------
0xe91ac0 0
0xe91ac4 0
0xe91ac8 15270224
定义:
标准库的allocator 类定义在头文件memory中,他帮助我们将内存分配和对象构造分离出来。
他分配的内存是原始的,未构造的。说白了就是标准库类,用来分配未构造的内存。
实例:
#include <iostream>
#include <string>
#include <memory>
#include <vector>
using namespace std;
unique_ptr<string> demo(const char* s)
{
unique_ptr<string> temp(new string(s));
return temp;
}
int main()
{
//爱的初体验
allocator<string> alloc;
auto s = alloc.allocate(3);//返回分配内存的首地址
auto p = s;
alloc.construct(s,"helloworld1");//初始化对象
alloc.construct(++s,"helloworld2");
alloc.construct(++s,"helloworld3");
std::cout << *s << std::endl;
std::cout << *p << std::endl;
while (p != s )
{
alloc.destroy(--s);//释放对象,执行其修析构函数
}
alloc.deallocate(p,3);//释放内存
//拷贝和填充未初始化内存的算法
vector<int> vec(3);
vec = {1, 2, 3};
allocator<int> alloc1;
auto p1 = alloc1.allocate(vec.size()*2);
auto s1 = p1;
auto q1 = uninitialized_copy(vec.begin(), vec.end(), p1);//返回的最后构造元素的下一个位置
uninitialized_fill_n(q1, vec.size(), 0);
while ((p1-s1) < (vec.size()*2))
{
std::cout << "\t" << *p1++;
}
return 0;
}
输出结果:
helloworld3
helloworld1
1 2 3 0 0 0
Note:
1.为了使用allocate 返回的内存,我们必须用constructor 构造对象。使用未构造的内存,其行为是未定义的。2.我们智能对真正构造的元素destory()。