#include <iostream>
using namespace std;
class A
{
public:
virtual ~A()
{
cout << "~A()" << endl;
}
void* operator new (std::size_t size)
{
cout << "void* operator new (std::size_t size)" << endl;
return ::operator new(size);
}
// placement new
void* operator new (std::size_t size, void* ptr) noexcept
{
cout << "void* operator new (std::size_t size, void* ptr) noexcept" << endl;
return ::operator new(size, ptr);
}
void operator delete (void* ptr, std::size_t size) noexcept
{
// От куда компиль взял размер класса B?
cout << "delete (void* ptr, std::size_t size); size = " << size << "!!!" << endl;
::operator delete(ptr);
}
void operator delete (void* ptr, void* voidptr2) noexcept
{
cout << "void operator delete (void* ptr, void* voidptr2) noexcept" << endl;
::operator delete(ptr, voidptr2);
}
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept = delete;
void* operator new[] (std::size_t size) = delete;
void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value) noexcept = delete;
void* operator new[] (std::size_t size, void* ptr) noexcept = delete;
void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) noexcept = delete;
void operator delete[] (void* ptr) noexcept = delete;
void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) noexcept;
void operator delete[] (void* ptr, void* voidptr2) noexcept = delete;
private:
int _i1;
};
class B : public A
{
public:
virtual ~B()
{
cout << "~B()" << endl;
}
private:
int _i2;
int _i3;
};
int main() {
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(B) = " << sizeof(B) << endl << endl;
B* b = new B();
delete (A*)b; // call sized deallocation function
B* b2 = reinterpret_cast<B*>(::operator new(sizeof(B)));
new(b2) B();
delete (A*)b2; // call sized deallocation function
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQQp7CnB1YmxpYzoKCXZpcnR1YWwgfkEoKQoJewoJCWNvdXQgPDwgIn5BKCkiIDw8IGVuZGw7Cgl9CgkKCXZvaWQqIG9wZXJhdG9yIG5ldyAoc3RkOjpzaXplX3Qgc2l6ZSkKCXsKCQljb3V0IDw8ICJ2b2lkKiBvcGVyYXRvciBuZXcgKHN0ZDo6c2l6ZV90IHNpemUpIiA8PCBlbmRsOwoJCXJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplKTsKCX0KCQoJLy8gcGxhY2VtZW50IG5ldwoJdm9pZCogb3BlcmF0b3IgbmV3IChzdGQ6OnNpemVfdCBzaXplLCB2b2lkKiBwdHIpIG5vZXhjZXB0Cgl7CgkJY291dCA8PCAidm9pZCogb3BlcmF0b3IgbmV3IChzdGQ6OnNpemVfdCBzaXplLCB2b2lkKiBwdHIpIG5vZXhjZXB0IiA8PCBlbmRsOwoJCXJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplLCBwdHIpOwoJfQoJCgl2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCogcHRyLCBzdGQ6OnNpemVfdCBzaXplKSBub2V4Y2VwdAoJewoJCS8vINCe0YIg0LrRg9C00LAg0LrQvtC80L/QuNC70Ywg0LLQt9GP0Lsg0YDQsNC30LzQtdGAINC60LvQsNGB0YHQsCBCPwoJCWNvdXQgPDwgImRlbGV0ZSAodm9pZCogcHRyLCBzdGQ6OnNpemVfdCBzaXplKTsgc2l6ZSA9ICIgPDwgc2l6ZSA8PCAiISEhIiA8PCBlbmRsOwoJCTo6b3BlcmF0b3IgZGVsZXRlKHB0cik7Cgl9CgkKCXZvaWQgb3BlcmF0b3IgZGVsZXRlICh2b2lkKiBwdHIsIHZvaWQqIHZvaWRwdHIyKSBub2V4Y2VwdAoJewoJCWNvdXQgPDwgInZvaWQgb3BlcmF0b3IgZGVsZXRlICh2b2lkKiBwdHIsIHZvaWQqIHZvaWRwdHIyKSBub2V4Y2VwdCIgPDwgZW5kbDsKCQk6Om9wZXJhdG9yIGRlbGV0ZShwdHIsIHZvaWRwdHIyKTsJCgl9CgkJCgl2b2lkKiBvcGVyYXRvciBuZXcgKHN0ZDo6c2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6bm90aHJvd190JiBub3Rocm93X3ZhbHVlKSBub2V4Y2VwdCA9IGRlbGV0ZTsKCXZvaWQqIG9wZXJhdG9yIG5ld1tdIChzdGQ6OnNpemVfdCBzaXplKSA9IGRlbGV0ZTsKCXZvaWQqIG9wZXJhdG9yIG5ld1tdIChzdGQ6OnNpemVfdCBzaXplLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYgbm90aHJvd192YWx1ZSkgbm9leGNlcHQgPSBkZWxldGU7Cgl2b2lkKiBvcGVyYXRvciBuZXdbXSAoc3RkOjpzaXplX3Qgc2l6ZSwgdm9pZCogcHRyKSBub2V4Y2VwdCA9IGRlbGV0ZTsKCQoJdm9pZCBvcGVyYXRvciBkZWxldGUgKHZvaWQqIHB0ciwgY29uc3Qgc3RkOjpub3Rocm93X3QmIG5vdGhyb3dfY29uc3RhbnQpIG5vZXhjZXB0ID0gZGVsZXRlOwoJdm9pZCBvcGVyYXRvciBkZWxldGVbXSAodm9pZCogcHRyKSBub2V4Y2VwdCA9IGRlbGV0ZTsKCXZvaWQgb3BlcmF0b3IgZGVsZXRlW10gKHZvaWQqIHB0ciwgY29uc3Qgc3RkOjpub3Rocm93X3QmIG5vdGhyb3dfY29uc3RhbnQpIG5vZXhjZXB0OwoJdm9pZCBvcGVyYXRvciBkZWxldGVbXSAodm9pZCogcHRyLCB2b2lkKiB2b2lkcHRyMikgbm9leGNlcHQgPSBkZWxldGU7CgkKcHJpdmF0ZToKCWludCBfaTE7Cn07CgpjbGFzcyBCIDogcHVibGljIEEKewpwdWJsaWM6Cgl2aXJ0dWFsIH5CKCkKCXsKCQljb3V0IDw8ICJ+QigpIiA8PCBlbmRsOwoJfQoJCnByaXZhdGU6CglpbnQgX2kyOwoJaW50IF9pMzsKfTsKCmludCBtYWluKCkgewoJY291dCA8PCAic2l6ZW9mKEEpID0gIiA8PCBzaXplb2YoQSkgPDwgZW5kbDsKCWNvdXQgPDwgInNpemVvZihCKSA9ICIgPDwgc2l6ZW9mKEIpIDw8IGVuZGwgPDwgZW5kbDsKCQoJQiogYiA9IG5ldyBCKCk7CglkZWxldGUgKEEqKWI7IC8vIGNhbGwgc2l6ZWQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uCgkKCUIqIGIyID0gcmVpbnRlcnByZXRfY2FzdDxCKj4oOjpvcGVyYXRvciBuZXcoc2l6ZW9mKEIpKSk7CgluZXcoYjIpIEIoKTsgCglkZWxldGUgKEEqKWIyOyAvLyBjYWxsIHNpemVkIGRlYWxsb2NhdGlvbiBmdW5jdGlvbgoJCglyZXR1cm4gMDsKfQo=