See the following code:
#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;
}
output for above code:
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.
My question is :
1)Why nothrow version of delete is not called.
2)can i use size parameter in nothrow version of delete. like
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)What is use of nothrow version of delete.
4)I used same code in both version new and new[] , delete and delete[] but one is normal variable and another one is array variable how this ?.
5)The compiler gives warning : 'operator new' must not return NULL unless it is declared 'throw()' (or -fcheck-new is in effect) How to over come that?