103 C++ 内存高级话题 重载全局new,delete,定位new以及重载等

一 重载全局 operator new 和 operator delete 操作符,知道这个语法就行了,每人这么用

前面是看到了 我们在某一个类中 重写了  operator new 和 operator delete。

实际上也可以 重载全局的 operator new 和 operator delete。

重载了全局的 operator new 和 operator delete 会对整个.cpp中的所有其作用,不建议用,这里只是知道语法就可以了。

//全局重写 operator new,和某一个具体类写法不同,不能加static 
 void* operator new(size_t size) {
	cout << "operator new size = " << size << endl;
	return malloc(size);
}
//全局从写 operator delete,和某一个具体类写法不同,不能加static 
 void operator delete(void *phead) {
	cout << "operator delete " << endl;
	free (phead);
}
 //全局重写 operator new[],和某一个具体类写法不同,不能加static 
 void* operator new[](size_t size) {
	cout << "operator new[] size = " << size << endl;
	return malloc(size);
}
//全局重写 operator delete[],和某一个具体类写法不同,不能加static 
 void operator delete[](void *phead) {
	cout << "operator delete[] " << endl;
	free(phead);
}


class Teacher39 {
public:
	Teacher39() {
		cout << "Teacher39 gouzao" << endl;
	}
	~Teacher39() {
		cout << "Teacher39 xigou" << endl;
	}
};

void main() {
	cout << "mmm" << endl;
	Teacher39 *ptea = new Teacher39();
}

如上,重载全局operator new 和 operator delete 不需要写static

对整个.cpp文件中的class都会其作用

定位new (placement new),这个是有点用,应用场景应该是:可以重复利用 一块内存,也可以节约一点 malloc 的时间,但是这个好像在目前服务器

这个是啥意思呢?

就是new 的时候不分配内存,内存要提前分配好。

功能:

在已经分配的原始内存中初始化一个对象。

定位 new 不会分配内存,你需要提前分配内存,给这个 定位new 使用

说白了:定位new 就是能够在 一个预先分配好的地址中构造一个对象。

class Teacher39 {
public:
	int mage;
	Teacher39() {
		cout << "Teacher39 gouzao" << endl;
	}
	~Teacher39() {
		cout << "Teacher39 xigou" << endl;
	}
};
void main() {
	void* ptea =(void *) new char[sizeof(Teacher39)];
	Teacher39 * realptea = new(ptea)Teacher39();
	realptea->mage = 90;
	cout << "realptea->mage = " << realptea->mage << endl;

	//删除方法1
	//delete ptea;

	//删除方法2
	realptea->~Teacher39();//调用析构函数
	delete[](void *) realptea;


}

三 多种版本的 operator new/delete 重载,知道有这个语法就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值