一 重载全局 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;
}