当前位置: 代码迷 >> 综合 >> operator new 与 placement new之间的微妙关系
  详细解决方案

operator new 与 placement new之间的微妙关系

热度:63   发布时间:2023-12-15 04:24:45.0
#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,其实我觉的它们都一样吧,hhhhstatic 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;
}
  相关解决方案