#include<iostream>
using namespace std;
class Test
{
public:
Test(int n):n_(n)
{
cout<<"Test(int n):n_(n)"<<endl;
}
// 拷贝构造函数
Test(Test& other)
{
cout<<"Test(Test& other)"<<endl;
}
~Test()
{
cout<<"~Test()"<<endl;
}
// operatoe new delete 重载
void* operator new(size_t size)
{
cout<<"void* operator new(size_t size)"<<endl;
void* p = malloc(size);
return p;
}
// void operator delete(void* p)
// void operator delete(void* p, size_t size)
// 同时存在,第一个优先调用
void operator delete(void* p)
{
cout<<"void operator delete(void* p)"<<endl;
free(p);
}
void operator delete(void* p, size_t size)
{
cout<<"void operator delete(void* p, size_t size)"<<endl;
free(p);
}
// placement new
void* operator new(size_t size, void* p)
{
return p;
}
void operator delete(void *p, void *)
{
free(p);
}
// 带参数的operator new delete 为了方便定位内存泄漏问题
void* operator new(size_t size, const char* file, long line)
{
cout<<file<<":"<<line<<endl;
void* p = malloc(size);
return p;
}
void operator delete(void* p, const char* file, long line)
{
cout<<file<<":"<<line<<endl;
free(p);
}
void operator delete(void* p,size_t size, const char* file, long line)
{
cout<<file<<":"<<line<<endl;
free(p);
}
int n_;
};
// 全局
// operatoe new delete 重载
void* operator new(size_t size)
{
cout<<"global void* operator new(size_t size)"<<endl;
void* p = malloc(size);
return p;
}
//void operator delete(void* p)
//void operator delete(void* p, size_t size)
//同时存在,第一个优先调用
void operator delete(void *p)
{
cout<<"gloabal void operator delete(void* p)"<<endl;
free(p);
}
void operator delete(void* p, size_t size)
{
cout<<"global void operator delete(void* p, size_t size)"<<endl;
free(p);
}
void* operator new[](size_t size)
{
cout<<"global void* operator new[](size_t size)"<<endl;
void* p = malloc(size);
return p;
}
// void operator delete(void* p)
// void operator delete(void* p, size_t size)
// 同时存在,第一个优先调用
void operator delete[](void* p)
{
cout<<"gloabal void operator delete[](void* p)"<<endl;
free(p);
}
int main(void)
{
Test* t = new Test(100); // 等价于 operator new (分配内存) + 构造函数(创建对象)
delete t;
/*
void* operator new(size_t size)
Test(int n):n_(n)
~Test()
void operator delete(void* p)
*/
// placement new 在已经存在的内存(堆/栈)上构造对象
char chunk[10];
// 只要chunk的内存大于Test的内存大小
// 创建对象于chunk上,
// 1、调用opreator new(size_t, void* Where) return Where 并没有调用new/malloc进行内存分配,而是直接返回chunk地址
// 2、调用构造函数进行对象的创建
// 3、使用新式转换/旧式转换 将chunk地址直接转换为Test对象,并将他们的地址输出,结果地址是一样的
//error C2660: “Test::operator new”: 函数不接受 2 个参数
// 需要重载placement new
Test* t2 = new(chunk)Test(200); // inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0() + 构造函数(创建对象)
t2->~Test();
/*
cout<<t2->n_<<endl;
// 旧式转换
Test* t3 = (Test*)chunk;
cout<<t3->n_<<endl;
//Test* t4 = static_cast<Test*>chunk;
//cout<<t4->n_<<endl;
// reinterpret_cast<Type*> 为重新解释
// 新式转换
Test* t5 = reinterpret_cast<Test*>(chunk);
cout<<t5->n_<<endl;
*/
// 全局operator new delelte
//调用的是全局的 new.cpp中void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
// 可以重载全局的operator new delete ,使其调用重载的
char* c = new char;
delete c;
/*global void* operator new(size_t size)
gloabal void operator delete(void* p)*/
// 数组
// 调用全局 newop.cpp 中void *__CRTDECL operator new[](size_t count) _THROW1(std::bad_alloc)
// 可以重载全局的operator new[] deletep[] ,使其调用重载的
char* c1 = new char[10];
delete[] c1;
/*
global void* operator new[](size_t size)
gloabal void operator delete[](void* p)*/
// 含参数的Operator new delete
Test* t5 = new(__FILE__, __LINE__) Test(200);
delete t5;
return 0;
}
override operator new / delete
最新推荐文章于 2025-04-05 22:30:49 发布