一 重载全局 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)
这个是啥意思呢?
就是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;//删除方法2realptea->~Teacher39();//调用析构函数delete[](void *) realptea;}