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

来源:互联网 发布:iphone 62078端口 编辑:程序博客网 时间:2024/05/29 10:58

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:00F7B138delete success:00F7B138

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

原创粉丝点击