重载new/delete自定义内存管理

本文探讨了C++中的new和delete操作符,它们负责内存分配和对象构造/析构。通过重载new/delete,可以定制内存管理,包括在不同区域分配内存。文章介绍了全局和局部重载的使用,并展示了两个编程实验,分别是在静态存储区和指定内存地址创建动态对象。

new/delete是C++预定义的操作符。
new/delete行为:
–new
1、获取足够大的内存空间(默认是堆空间)
2、调用类的构造函数创建对象
–delete
1、调用析构函数销毁对象
2、回收内存空间(默认为堆空间)
不管是new还是delete操作,都有两步,new和delete操作是对称的。

C++中new/delete操作符是可以重载的。
–全局重载(不推荐)
–局部重载(在具体的类中重载)
重载C++的new/delete操作符的意义在于改变动态创建对象时内存的分配方式。

【new/delete的重载方式】

void* operator new (unsigned int size)
{
    void* ret = NULL;
    //To do...
    return ret;
}

void operator delete(void* p)
{
        //To do...
}

【编程实验】在静态存储区创建动态对象

/*testMem.h
*重载new/delete操作符
*在静态存储区创建动态对象实验
*/
#include <cstdlib>
#include <iostream>
using namespace std;

class test
{
    static const unsigned int count = 4;//这里指定可以创建多少个对象 N例设计模式?
    static char c_buffer[];//这里存储动态创建的对象
    static char c_map[];//标记内存是否可用
public:
    void* operator new (unsigned int size)
    {
        void* ret = NULL;
        for (int i = 0; i < count; i++)
        {
            if (!c_map[i])//可用为0,不可用为1
            {
                c_map[i] = 1;//标记内存不可用
                ret = c_buffer + i * sizeof(test);//分配c_buffer中的内存
                cout << "new success:"<< ret << endl;
                break;//分配到内存就跳出循环
            }

        }
        return ret;
    }

    void operator delete(void* p)
    {
        if (p != NULL)
        {
            char* mem = reinterpret_cast<char*>(p);//对void*指针做转换
            int index = (mem - c_buffer) / sizeof(test);//计算地址在c_map中对应的下标
            int flag = (mem - c_buffer) % sizeof(test);//计算指针偏移长度是否为test大小整数倍
            if (flag == 0 && index >= 0 && index < count)//对前面计算的值作判断
            {
                c_map[index] = 0;//标记内存可用
                cout << "delete success:"<< p << endl;
            }

        }
    }
};

char test::c_buffer[test::count * sizeof(test)] = {0};//为静态成员变量赋值
char test::c_map[test::count] = {0};//为静态成员变量赋值
//main.cc
#include "testMem.h"
#include <iostream>
using namespace std;

int main()
{
    test* p = new test;
    delete p;
    return 0;
}

VS2015执行结果:

new success:00F7B138
delete success:00F7B138

【编程实验】在指定内存地址创建动态对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值