请看下面的代码:
#include<iostream>
#include<stdlib.h>
#include<new>
using namespace std;
class ex
{
int x;
public:
ex():ex(0){}
ex(int x):x(x)
{
//cout<<"\nConstructor";
}
void *operator new(size_t siz)
{
void *p;
cout<<"\nOverloaded new operator normal version";
p=malloc(siz);
if(p==NULL)
{
bad_alloc ba;
throw ba;
}
else
return p;
}
void operator delete(void *p,size_t sz)
{
cout<<"\nOverloaded delete normal version:"<<sz;
free(p);
}
void *operator new(size_t siz,const nothrow_t &tag)
{
void *p;
cout<<"\nOverloaded new operator nothrow version";
p=malloc(siz);
if(p==NULL)
{
return 0;
}
else
return p;
}
void operator delete(void *p,const nothrow_t &tag)
{
cout<<"\nOverloaded delete nothrow version";
free(p);
}
void *operator new[](size_t siz)
{
void *p;
cout<<"\nOverloaded new operator normal version in array";
p=malloc(siz);
if(p==NULL)
{
bad_alloc ba;
throw ba;
}
else
return p;
}
void operator delete[](void *p,size_t sz)
{
cout<<"\nOverloaded delete normal version in array:"<<sz;
free(p);
}
void *operator new[](size_t siz,const nothrow_t &tag)
{
void *p;
cout<<"\nOverloaded new operator nothrow version in array";
p=malloc(siz);
if(p==NULL)
{
return 0;
}
else
return p;
}
void operator delete[](void *p,const nothrow_t &tag)
{
cout<<"\nOverloaded delete nothrow version in array";
free(p);
}
};
int main()
{
ex *pt;
pt=new ex;
delete pt;
pt=new ex[10];
delete[] pt;
pt=new(nothrow) ex;
delete pt;
pt=new(nothrow) ex[10];
delete[] pt;
}
以上代码的输出结果:
Overloaded new operator normal version
Overloaded delete normal version:4
Overloaded new operator normal version in array
Overloaded delete normal version in array:44
Overloaded new operator nothrow version
Overloaded delete normal version:4
Overloaded new operator nothrow version in array
Overloaded delete normal version in array:44
Process returned 0 (0x0) execution time : 0.724 s
Press any key to continue.
我的问题是:
1)为什么不会调用nothrow版本的delete。
2)我能在nothrow版本的delete中使用size参数吗,比如:
void operator delete[](void *p,const nothrow_t &tag,size_t sz);
or
void operator delete(void *p,const nothrow_t &tag,size_t sz);
3) nothrow版本的delete有什么用途。
4) 我在new和new[],delete和delete[]中使用了相同的代码,但一个是普通变量,另一个是数组变量,这怎么回事?
5) 编译器会发出警告:'operator new'必须不返回NULL,除非它被声明为'throw()'(或-fcheck-new生效)。如何解决这个问题?
\n
不会强制刷新缓冲区,只有std::endl
才能做到。 - underscore_dstd::cout
默认与 C 标准 I/O 流同步,而 stdout 默认是行缓冲的。不过,使用std::endl
或者更明确的std::flush
更好。 - Ulrich Eckhardt