#include <iostream>
using namespace std;
class Base
{
public:
Base() {};
virtual ~Base() {};
void* operator new[](size_t size)
{
size_t* ptr = static_cast<size_t*>(malloc((size + 1) * sizeof(size_t)));
if (ptr == nullptr)
{
throw std::bad_alloc();
}
*ptr = size;
return (ptr + sizeof(size_t));
}
void operator delete[](void* ptr, size_t size)
{
if (ptr != nullptr)
{
free(static_cast<size_t*>(ptr) - sizeof(size_t));
}
}
};
class Derived : public Base
{
public:
Derived(int value) :
m_value(value)
{
}
private:
int m_value;
};
int main() {
Derived* i = new Derived[18] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 42, 100 };
void* i2 = i;
size_t* size = (static_cast<size_t*>(i2) - sizeof(size_t));
printf("Size: '%d'\n", (int)*size);
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgCiAgICBjbGFzcyBCYXNlCiAgICB7CiAgICBwdWJsaWM6CiAgICAJQmFzZSgpIHt9OwogICAgCXZpcnR1YWwgfkJhc2UoKSB7fTsKICAgICAKICAgIAl2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSkKICAgIAl7CiAgICAJCXNpemVfdCogcHRyID0gc3RhdGljX2Nhc3Q8c2l6ZV90Kj4obWFsbG9jKChzaXplICsgMSkgKiBzaXplb2Yoc2l6ZV90KSkpOwogICAgCQlpZiAocHRyID09IG51bGxwdHIpCiAgICAJCXsKICAgIAkJCXRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgICAJCX0KICAgIAkJKnB0ciA9IHNpemU7CiAgICAJCXJldHVybiAocHRyICsgc2l6ZW9mKHNpemVfdCkpOwogICAgCX0KICAgICAKICAgIAl2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpCiAgICAJewogICAgCQlpZiAocHRyICE9IG51bGxwdHIpCiAgICAJCXsKICAgIAkJCWZyZWUoc3RhdGljX2Nhc3Q8c2l6ZV90Kj4ocHRyKSAtIHNpemVvZihzaXplX3QpKTsKICAgIAkJfQogICAgCX0KICAgIH07CiAgICAgCiAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UKICAgIHsKICAgIHB1YmxpYzoKICAgIAlEZXJpdmVkKGludCB2YWx1ZSkgOgogICAgCQltX3ZhbHVlKHZhbHVlKQogICAgCQl7CiAgICAJCX0KICAgICAKICAgIHByaXZhdGU6CiAgICAJaW50IG1fdmFsdWU7CiAgICB9OwogICAgIAogICAgaW50IG1haW4oKSB7CiAgICAJRGVyaXZlZCogaSA9IG5ldyBEZXJpdmVkWzE4XSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDQyLCAxMDAgfTsKICAgIAl2b2lkKiBpMiA9IGk7CiAgICAJc2l6ZV90KiBzaXplID0gKHN0YXRpY19jYXN0PHNpemVfdCo+KGkyKSAtIHNpemVvZihzaXplX3QpKTsKICAgIAlwcmludGYoIlNpemU6ICclZCdcbiIsIChpbnQpKnNpemUpOwogICAgCXJldHVybiAwOwogICAgfQo=