#include <iostream>
#include <new>
using namespace std;
class Data {
public:
Data(int first) {
data[0] = first;
cout<<"Constructor 1 " <<first;
}
Data(int first, int second) {
data[0] = first;
data[1] = second;
cout<<"Constructor 2 " <<first<< ";"<<second;
}
void* operator new(size_t x);
void* operator new(size_t x, const std::nothrow_t& nothrow_value) throw();
void operator delete(void* ptr);
private:
int data[10];
};
//class DataTag;
class DumbClass{};
//typedef boost::singleton_pool<DataTag, sizeof(Data)> DataPool;
void* Data::operator new(size_t x) {
cout<<"new 1 operator called";
void* mem = malloc(x);
return mem;
/*void* ptr = DataPool::malloc();
if (ptr) {
return ptr;
} else {
throw std::bad_alloc();
}*/
}
void* Data::operator new(size_t x, const std::nothrow_t& nothrow_value) throw() {
cout<<"new 2 operator called";
return new DumbClass();
//return DataPool::malloc();
}
void Data::operator delete(void* ptr) {
//DataPool::free(ptr);
free(ptr);
}
int main() {
Data* data = new Data(1, 2);
return 0;
//Data* data = new Data(1);
delete data;
data = new (std::nothrow) Data(1, 2);
delete data;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxuZXc+CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIGNsYXNzIERhdGEgewogICAgcHVibGljOgogICAgICAgICAgICBEYXRhKGludCBmaXJzdCkgewogICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBmaXJzdDsKICAgICAgICAgICAgICAgICAgICBjb3V0PDwiQ29uc3RydWN0b3IgMSAiIDw8Zmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAKICAgICAgICAgICAgRGF0YShpbnQgZmlyc3QsIGludCBzZWNvbmQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gZmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9IHNlY29uZDsKICAgICAgICAgICAgICAgICAgICBjb3V0PDwiQ29uc3RydWN0b3IgMiAiIDw8Zmlyc3Q8PCAiOyI8PHNlY29uZDsKICAgICAgICAgICAgfQogICAgIAogICAgICAgICAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHgpOwogICAgIAogICAgICAgICAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHgsIGNvbnN0IHN0ZDo6bm90aHJvd190JiBub3Rocm93X3ZhbHVlKSB0aHJvdygpOwogICAgIAogICAgICAgICAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIpOwogICAgIAogICAgcHJpdmF0ZToKICAgICAgICAgICAgaW50IGRhdGFbMTBdOwogICAgfTsKICAgICAKICAgIC8vY2xhc3MgRGF0YVRhZzsKICAgIGNsYXNzIER1bWJDbGFzc3t9OwogICAgIAogICAgLy90eXBlZGVmIGJvb3N0OjpzaW5nbGV0b25fcG9vbDxEYXRhVGFnLCBzaXplb2YoRGF0YSk+IERhdGFQb29sOwogICAgIAogICAgdm9pZCogRGF0YTo6b3BlcmF0b3IgbmV3KHNpemVfdCB4KSB7CiAgICAJY291dDw8Im5ldyAxIG9wZXJhdG9yIGNhbGxlZCI7CiAgICAJdm9pZCogbWVtID0gbWFsbG9jKHgpOwogICAgCXJldHVybiBtZW07CiAgICAgICAgICAgIC8qdm9pZCogcHRyID0gRGF0YVBvb2w6Om1hbGxvYygpOwogICAgICAgICAgICBpZiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgICAgICAgICB9Ki8KICAgIH0KICAgICAKICAgIHZvaWQqIERhdGE6Om9wZXJhdG9yIG5ldyhzaXplX3QgeCwgY29uc3Qgc3RkOjpub3Rocm93X3QmIG5vdGhyb3dfdmFsdWUpIHRocm93KCkgewogICAgCSAgICAJY291dDw8Im5ldyAyIG9wZXJhdG9yIGNhbGxlZCI7CiAgICAJICAgIAlyZXR1cm4gbmV3IER1bWJDbGFzcygpOwogICAgICAgICAgICAvL3JldHVybiBEYXRhUG9vbDo6bWFsbG9jKCk7CiAgICB9CiAgICAgCiAgICB2b2lkIERhdGE6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIpIHsKICAgICAgICAgICAgLy9EYXRhUG9vbDo6ZnJlZShwdHIpOwogICAgICAgICAgICBmcmVlKHB0cik7CiAgICB9CiAgICAgCiAgICBpbnQgbWFpbigpIHsKICAgIAkJRGF0YSogZGF0YSA9IG5ldyBEYXRhKDEsIDIpOwogICAgCQlyZXR1cm4gMDsKICAgICAgICAgICAgLy9EYXRhKiBkYXRhID0gbmV3IERhdGEoMSk7CiAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwogICAgICAgICAgICBkYXRhID0gbmV3IChzdGQ6Om5vdGhyb3cpIERhdGEoMSwgMik7CiAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwogICAgfQoK