版权声明:我是一只快乐的小妖精,网络收集与整理和心得,随意取走。 https://blog.csdn.net/qwq1503/article/details/86711851
#include <iostream>
#include <cstdlib>
using namespace std;
class Base{
public:
Base(int n):_A(n){
_A = n;
}
Base(){
_A = -1;
}
// 注意: 一旦有一个operator new 重载,那么其他的operator new 形式的函数都必须重载
// 第一个参数 size_t size, 为固定参数类型,传入需要内存的大小
static void* operator new(size_t size, void* p, int n){
cout<< "size:"<<size<<endl;
cout<< "n:"<<n<<endl;
return p;
}
// 这个是new(p)Base; new(p)Base(20);的处理函数,如果不重载,那么
// 当调用上面两个初始化方法时,就会报出错误
// 它也什么也没有做,应该也是编绎器自带的operator new的实现方法
// 有人把这种调用称为placement new,其实我觉的它们都一样吧,hhhh
static void* operator new(size_t size, void *p){
cout<<" static void* operator new(size_t size, void *p)- >"<<size<<endl;
return p;
}
// 这个更离奇,如果不重载,那没法调用 new Base; new Base(20);
// emmm,其他它什么也没有做,它应该就是编译器自带的operator new的实现方式
static void* operator new(size_t size){
cout<<"static void* operator new(size_t size)->"<<size<<endl;
return malloc(size);
}
void show(){
cout<<"_A:"<<_A<<endl;
}
private:
int _A;
int b;
};
int main(){
Base* p2 = nullptr;
// 如果malloc分配的空间小,可能也不会出错,但是会把内存空间给挤过去
Base* p= (Base*)malloc(sizeof(Base));
cout<<"sizeof(Base)->"<<sizeof(Base)<<endl;
cout<<"p->"<<p<<endl;
new(p)Base(20);
p->show();
cout<<"-------------"<<endl;
p2 = new Base(100);
p2->show();
cout<<"p->"<<p<<endl;
cout<<"p2->"<<p2<<endl;
cout<<"-------------"<<endl;
Base obj(2);
obj.show();
new(&obj)Base(20);
obj.show();
return 0;
}