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

2万+

被折叠的 条评论
为什么被折叠?



