#include <iostream>
using namespace std;
// class A
// {
// public:
// A(){}
// ~A(){}
// void *operator new(size_t t)
// {
// void *p=malloc(t);
// cout<<"this is new "<<endl;
// return p;
// }
// void operator delete(void* p)
// {
// free(p);
// cout<<"this is delete"<<endl;
// }
// };
// void *operator new(size_t size)
// {
// cout<<"globle new"<<endl;
// void *p=malloc(size);
// return p;
//
// }
// void operator delete(void* p)
// {
// free(p);
// cout<<"globle delete"<<endl;
// }
void* operator new(size_t size) // 重载成功
{
// printf("global new\n");
cout<<"globle new"<<endl;
return malloc(size);
//return ::operator new(size); // 递归调用提示 (warning)
}
void operator delete(void *p)
{
// printf("global delete\n");
cout<<"globle delete"<<endl;
free(p);
}
int main()
{
// A* pa=new A();
// delete pa;
int *pi=new int(4);
delete pi;
return 0;
}
//对于全局的operator new函数和operator delete函数的话,为什么不可以使用cout作为输出呢?是不是cout是流定义的,而printf是c标准库里面的呢
//还有就是这里的话使用printf输出的话,operator new 和operator delete好像是分别被执行了三次。这是为什么呢?
上面的例子中如果是使用类域内自定义的operator new 和operator delete 可以,但是使用全局的自定义operator new operator delete 的话如果是使用cout输出的话会报错
但是使用printf的话就不会了,为什么呢?是不是cout为STL中的流类操作,而在全局里面的话这些不兼容还是什么呢?还有为什么好像是被执行了三次一样,上面的代码执行图如下:
一定记住回来解决这个问题:
mark下:placement operator new 定义可以为全域的,和一般的operator new一样,一般情况下当构造函数出现异常的时候会调用placement operator delete 进行析构或者是编译器可以为placement operator new 找打格式合适的placement operator delete 也可以,否则就会内存泄露。
对于类域的话,一般情况下是都要对于placement 和非placement 的都要定义下。