C++内存分配之allocator入门

前言:

//分配内存的一般方法
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()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值