#include <iostream>
#include <cassert>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "construct" << endl;
}
~Foo()
{
cout << "destruct" << endl;
}
};
Foo* user(void* mem)
{
cout << " create" << endl;
return new(mem) Foo();
}
int main() {
void* mem=alloca(sizeof(Foo));
assert(mem);
Foo* foo=user(mem);
cerr << "delete" << endl;
foo->~Foo(); // нужно ЯВНО вызвать деструктор
//а вот память, выделенную alloca, освобождать НЕ НУЖНО.
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEZvbwp7CnB1YmxpYzoKCUZvbygpCgl7CgkJY291dCA8PCAiY29uc3RydWN0IiA8PCBlbmRsOwoJfQoJfkZvbygpCgl7CgkJY291dCA8PCAiZGVzdHJ1Y3QiIDw8IGVuZGw7Cgl9Cn07CgpGb28qIHVzZXIodm9pZCogbWVtKQp7Cgljb3V0IDw8ICIgY3JlYXRlIiA8PCBlbmRsOwoJcmV0dXJuIG5ldyhtZW0pIEZvbygpOwp9CgppbnQgbWFpbigpIHsKCQoJdm9pZCogbWVtPWFsbG9jYShzaXplb2YoRm9vKSk7Cglhc3NlcnQobWVtKTsKCUZvbyogZm9vPXVzZXIobWVtKTsKCWNlcnIgPDwgImRlbGV0ZSIgPDwgZW5kbDsKCWZvby0+fkZvbygpOyAvLyDQvdGD0LbQvdC+INCv0JLQndCeINCy0YvQt9Cy0LDRgtGMINC00LXRgdGC0YDRg9C60YLQvtGACgkvL9CwINCy0L7RgiDQv9Cw0LzRj9GC0YwsINCy0YvQtNC10LvQtdC90L3Rg9GOIGFsbG9jYSwg0L7RgdCy0L7QsdC+0LbQtNCw0YLRjCDQndCVINCd0KPQltCd0J4uCglyZXR1cm4gMDsKfQ==