#include <type_traits>
#include <stdexcept>
#include <memory>
#include <iostream>
struct ObjectType {
int arg1, arg2;
ObjectType() { std::cout << "default ctor called\n" ; } // this will NOT be printed!
ObjectType(int a1, int a2) : arg1(a1), arg2(a2) {}
void* operator new[](std::size_t n, int cnt, const ObjectType& o)
{
if (n!=0)
throw std::runtime_error("must use [0] with this new");
typedef std::aligned_storage<sizeof(o), std::alignment_of<ObjectType>::value>::type buf;
ObjectType* ptr = reinterpret_cast<ObjectType*>(new buf[cnt]);
std::uninitialized_fill_n(ptr, cnt, o);
return ptr;
}
};
int main()
{
ObjectType* object = new(100, ObjectType(1,2)) ObjectType[0]; // may not work with other classes!
std::cout << "element #0 == (" << object[0].arg1 << ", " << object[0].arg2 << ")\n";
std::cout << "element #99 == (" << object[99].arg1 << ", " << object[99].arg2 << ")\n";
delete[] object; // does not call destructors for each ObjectType, needs to be implemented too.
}
// tested with MSVC++ 2010 Express Edition too
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8aW9zdHJlYW0+CnN0cnVjdCBPYmplY3RUeXBlIHsKICAgICAgIGludCBhcmcxLCBhcmcyOwogICAgICAgT2JqZWN0VHlwZSgpIHsgc3RkOjpjb3V0IDw8ICJkZWZhdWx0IGN0b3IgY2FsbGVkXG4iIDsgfSAvLyB0aGlzIHdpbGwgTk9UIGJlIHByaW50ZWQhCiAgICAgICBPYmplY3RUeXBlKGludCBhMSwgaW50IGEyKSA6IGFyZzEoYTEpLCBhcmcyKGEyKSB7fQoKICAgICAgIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IG4sIGludCBjbnQsIGNvbnN0IE9iamVjdFR5cGUmIG8pCiAgICAgICB7CiAgICAgICAgICAgaWYgKG4hPTApCiAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIm11c3QgdXNlIFswXSB3aXRoIHRoaXMgbmV3Iik7CiAgICAgICAgICAgdHlwZWRlZiBzdGQ6OmFsaWduZWRfc3RvcmFnZTxzaXplb2YobyksIHN0ZDo6YWxpZ25tZW50X29mPE9iamVjdFR5cGU+Ojp2YWx1ZT46OnR5cGUgYnVmOwogICAgICAgICAgIE9iamVjdFR5cGUqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8T2JqZWN0VHlwZSo+KG5ldyBidWZbY250XSk7CiAgICAgICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGxfbihwdHIsIGNudCwgbyk7CiAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgICAgIE9iamVjdFR5cGUqIG9iamVjdCA9IG5ldygxMDAsIE9iamVjdFR5cGUoMSwyKSkgT2JqZWN0VHlwZVswXTsgLy8gbWF5IG5vdCB3b3JrIHdpdGggb3RoZXIgY2xhc3NlcyEKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJlbGVtZW50ICMwID09ICgiIDw8IG9iamVjdFswXS5hcmcxIDw8ICIsICIgPDwgb2JqZWN0WzBdLmFyZzIgPDwgIilcbiI7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJlbGVtZW50ICM5OSA9PSAoIiA8PCBvYmplY3RbOTldLmFyZzEgPDwgIiwgIiA8PCBvYmplY3RbOTldLmFyZzIgPDwgIilcbiI7CgogICAgICAgIGRlbGV0ZVtdIG9iamVjdDsgLy8gZG9lcyBub3QgY2FsbCBkZXN0cnVjdG9ycyBmb3IgZWFjaCBPYmplY3RUeXBlLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCB0b28uCn0KCi8vIHRlc3RlZCB3aXRoIE1TVkMrKyAyMDEwIEV4cHJlc3MgRWRpdGlvbiB0b28=