本文主要是介绍100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一 new 内存分配细节探秘
我们以分配10个char为例,说明,观察内存发现,当delete 的时候,实际上很多内存都改变了。
实际上 new 内存不是一个简单的事情。为了记录和管理分配出去的内存,额外分配了不少内存,造成了浪费。尤其是多次申请小块的内存,浪费更严重。
不同的编译器对于这块实现是不同的。
但是功能都是大同小异的,要管理 分配出去的内存,考虑效率等。
二 重载类中的 operator new 和 operator delete 操作符
前提
从前面的知识我们知道:当你new Teacher后,主要代码逻辑如下:
Teacher *ptea = new Teacher;
operator new();
malloc();
Teacher::Teacher();
-----------------------------------------
delete ptea;
Teacher::~Teacher();
operator delete();
free();
思路
我们这里就是要重写operator new()方法,C++编译器在operator new()方法中调用了 malloc()方法分配内存。因此我们重写时也需要malloc内存。
我们这里就是要重写operator delete()方法,C++编译器在operator delete()方法中调用了 free()释放内存。因此我们重写时也需要free内存。
写法
static void* operator new(size_t size) {
Teacher35* ppoint = (Teacher35 *)malloc(size);
return ppoint;
}
static void operator delete(void *phead) {
free(phead);
}
class Teacher35 {
public:Teacher35() {cout << "Teacher35 gouzao fangfa " << endl;//3}~Teacher35() {cout << "Teacher35 xigou" << endl;//5}//static void* operator new(size_t size) {// Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35有一个int的时候,size是4// return ppoint;//}//static void operator delete(void *phead) {// free(phead);//6//}static void* operator new(size_t size);static void operator delete(void *phead);int mage;
};
void* Teacher35::operator new(size_t size) {Teacher35* ppoint = (Teacher35 *)malloc(size);return ppoint;
}void Teacher35::operator delete(void *phead) {free(phead);
}void main() {Teacher35 *ptea = new Teacher35; //1cout << "111" << endl;delete ptea; //4cout << "222" << endl;
}
三 重载类中的 operator new[] 和 operator delete[] 操作符
class Teacher35 {
public:Teacher35() {cout << "Teacher35 gouzao fangfa " << endl;//3}~Teacher35() {cout << "Teacher35 xigou" << endl;//5}static void* operator new(size_t size) {Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35有一个int的时候,size是4return ppoint;}static void operator delete(void *phead) {free(phead);//6}//static void* operator new(size_t size);//static void operator delete(void *phead);static void* operator new[](size_t size) {Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35[3]的时候,加上4个字节,这4个字节 存储的是3,因此 size 大小是 3个teacher的大小 = 3*sizeof(Teacher)+ 4个字节 记录几个teacher(也就是3)return ppoint;}static void operator delete[](void *phead) {free(phead);//6}int mage;
};
//void* Teacher35::operator new(size_t size) {
// Teacher35* ppoint = (Teacher35 *)malloc(size);
// return ppoint;
//}
//
//void Teacher35::operator delete(void *phead) {
// free(phead);
//}void main() {//Teacher35 *ptea = new Teacher35; //1//cout << "111" << endl;//delete ptea; //4//cout << "222" << endl;Teacher35 *ptea = new Teacher35[3];delete[] ptea;
}
这篇关于100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!