#include <algorithm>
#include <iostream>
#include <new>
using namespace std;
struct A
{
static void * operator new [] (size_t t, int first, int second);
static void operator delete [] (void *p, size_t t);
static void operator delete [] (void *p, int first, int second)
{
cout << "3 parameters deallocation: " << first << ", " << second << endl;
return ::operator delete[](p);
}
};
// simple POD struct to store the placement parameters
struct info {
int first_param, second_param;
};
void* A::operator new [] (size_t t, int first, int second)
{
cout << "3 parameters allocation: " << first << ", " << second << endl;
// allocate sizeof(info) extra space to store the parameters
auto const p = ::operator new[](t + sizeof(info));
auto const pinfo = reinterpret_cast<char*>(p) + t;
auto const tmp = info{first, second};
std::copy_n(reinterpret_cast<const char*>(&tmp), sizeof(info), pinfo);
return p;
}
static void A::operator delete [] (void *p, std::size_t t) {
// retrieve the parameters that we stored in operator new [].
auto const pinfo = reinterpret_cast<const char*>(p) + t;
auto tmp = info{};
std::copy_n(pinfo, sizeof(info), reinterpret_cast<char*>(&tmp));
cout << "Deleting with original parameters: " << tmp.first_param << ", " << tmp.second_param << endl;
::operator delete[](p);
}
int main()
{
A *a = new (5,5) A[10]; //operator new [] (size_t, int, int) invoked
A *b = new (3,7) A[2]; //operator new [] (size_t, int, int) invoked
delete [] a;
delete [] b;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bmV3PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBCnsKICAgIHN0YXRpYyB2b2lkICogb3BlcmF0b3IgbmV3IFtdIChzaXplX3QgdCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kKTsKICAgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSBbXSAodm9pZCAqcCwgc2l6ZV90IHQpOwogICAgc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlIFtdICh2b2lkICpwLCBpbnQgZmlyc3QsIGludCBzZWNvbmQpCiAgICB7CiAgICAgICAgY291dCA8PCAiMyBwYXJhbWV0ZXJzIGRlYWxsb2NhdGlvbjogIiA8PCBmaXJzdCA8PCAiLCAiIDw8IHNlY29uZCA8PCBlbmRsOwogICAgICAgIHJldHVybiA6Om9wZXJhdG9yIGRlbGV0ZVtdKHApOwogICAgfQp9OwoKLy8gc2ltcGxlIFBPRCBzdHJ1Y3QgdG8gc3RvcmUgdGhlIHBsYWNlbWVudCBwYXJhbWV0ZXJzCnN0cnVjdCBpbmZvIHsKCWludCBmaXJzdF9wYXJhbSwgc2Vjb25kX3BhcmFtOwp9OwoKdm9pZCogQTo6b3BlcmF0b3IgbmV3IFtdIChzaXplX3QgdCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kKQp7Cgljb3V0IDw8ICIzIHBhcmFtZXRlcnMgYWxsb2NhdGlvbjogIiA8PCBmaXJzdCA8PCAiLCAiIDw8IHNlY29uZCA8PCBlbmRsOwoJLy8gYWxsb2NhdGUgc2l6ZW9mKGluZm8pIGV4dHJhIHNwYWNlIHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXJzCiAgICBhdXRvIGNvbnN0IHAgPSA6Om9wZXJhdG9yIG5ld1tdKHQgKyBzaXplb2YoaW5mbykpOwogICAgYXV0byBjb25zdCBwaW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHApICsgdDsKICAgIGF1dG8gY29uc3QgdG1wID0gaW5mb3tmaXJzdCwgc2Vjb25kfTsKICAgIHN0ZDo6Y29weV9uKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApLCBzaXplb2YoaW5mbyksIHBpbmZvKTsKICAgIHJldHVybiBwOwp9CgpzdGF0aWMgdm9pZCBBOjpvcGVyYXRvciBkZWxldGUgW10gKHZvaWQgKnAsIHN0ZDo6c2l6ZV90IHQpIHsKCS8vIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2Ugc3RvcmVkIGluIG9wZXJhdG9yIG5ldyBbXS4KICAgIGF1dG8gY29uc3QgcGluZm8gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwKSArIHQ7CiAgICBhdXRvIHRtcCA9IGluZm97fTsKICAgIHN0ZDo6Y29weV9uKHBpbmZvLCBzaXplb2YoaW5mbyksIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ0bXApKTsKICAgIGNvdXQgPDwgIkRlbGV0aW5nIHdpdGggb3JpZ2luYWwgcGFyYW1ldGVyczogIiA8PCB0bXAuZmlyc3RfcGFyYW0gPDwgIiwgIiA8PCB0bXAuc2Vjb25kX3BhcmFtIDw8IGVuZGw7CiAgICA6Om9wZXJhdG9yIGRlbGV0ZVtdKHApOwp9CgppbnQgbWFpbigpCnsKICAgIEEgKmEgPSBuZXcgKDUsNSkgQVsxMF07IC8vb3BlcmF0b3IgbmV3IFtdIChzaXplX3QsIGludCwgaW50KSBpbnZva2VkCiAgICBBICpiID0gbmV3ICgzLDcpIEFbMl07IC8vb3BlcmF0b3IgbmV3IFtdIChzaXplX3QsIGludCwgaW50KSBpbnZva2VkCiAgICBkZWxldGUgW10gYTsKICAgIGRlbGV0ZSBbXSBiOwp9Cg==