重载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
【编程实验】在指定内存地址创建动态对象
阅读全文
0 0
- 重载new/delete自定义内存管理
- C++ -- 内存管理 之 重载new delete
- c++ 重载new和delete实现内存管理
- 内存管理 new、delete’
- 内存泄露:重载new delete
- 内存管理:new和delete
- 动态内存管理---new&delete
- 动态内存管理new&delete
- new和delete管理内存
- 动态内存管理(new/delete)
- 重载全局new/delete实现内存计数
- 重载全局new/delete实现内存检测
- c++ 重载 new delete 用堆来分配内存
- 内存泄露打印new和delete重载
- 重载new和delete,处理内存溢出
- 重载全局new/delete实现内存检测
- 重载new和delete检测内存泄漏
- 重载New和Delete检测内存泄漏
- 深入理解Spring4框架(二)——容器
- windows下的python-opencv的配置
- hdoj 1173 采矿
- 编写第一个Android程序
- OAuth 2.0 MAC Tokens
- 重载new/delete自定义内存管理
- 【机器学习系列之三】特征工程
- 基础匹配
- 自测02—素数对猜想
- 《java与模式》-7 工厂模式
- 如何输出TOMCAT的配置参数
- Java开发中的23种设计模式详解(转)
- 10.28-10.29总结(HTML结构&CSS)
- CodeForces