- #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==