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; //1
	cout << "111" << endl;
	delete ptea; //4
	cout << "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是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);

	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;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值