fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class base
  5. {
  6. public:
  7. virtual ~base() { }
  8. virtual void hi() = 0;
  9. virtual size_t instance_size() = 0;
  10. };
  11.  
  12. class A: base
  13. {
  14. public:
  15. virtual ~A() override { printf("*A destroyed*\n"); }
  16. virtual void hi() override { printf("Hi from A!\n"); }
  17. virtual size_t instance_size() override { return sizeof(*this); }
  18. };
  19.  
  20. class B: base
  21. {
  22. public:
  23. string name;
  24. B(const string& name): name(name) { }
  25. virtual ~B() override { printf("*B destroyed*\n"); }
  26. virtual void hi() override { printf("Hi from B, %s!\n", name.c_str()); }
  27. virtual size_t instance_size() override { return sizeof(*this); }
  28. };
  29.  
  30. class C: base
  31. {
  32. public:
  33. virtual ~C() override { printf("*C destroyed*\n"); }
  34. virtual void hi() override { printf("C says for you to go fuck yourself. >_<\n"); }
  35. virtual size_t instance_size() override { return sizeof(*this); }
  36. };
  37.  
  38. unsigned char raw_queue[999];
  39.  
  40. int main() {
  41. unsigned char* push_ptr = raw_queue;
  42. {
  43. A* a_ptr = new (push_ptr) A;
  44. printf("A (sizeof=%zd) created at offset %zd.\n", sizeof(A), push_ptr - raw_queue);
  45. push_ptr += sizeof(A);
  46. }
  47.  
  48. {
  49. B* b_ptr = new (push_ptr) B("Rika");
  50. printf("B (sizeof=%zd) created at offset %zd.\n", sizeof(B), push_ptr - raw_queue);
  51. push_ptr += sizeof(B);
  52. }
  53.  
  54. {
  55. C* c_ptr = new (push_ptr) C;
  56. printf("C (sizeof=%zd) created at offset %zd.\n", sizeof(C), push_ptr - raw_queue);
  57. push_ptr += sizeof(C);
  58. }
  59. unsigned char* end_ptr = push_ptr;
  60.  
  61. for (unsigned char* pop_ptr = raw_queue; pop_ptr < end_ptr; )
  62. {
  63. base* obj = (base*)pop_ptr;
  64. obj->hi();
  65. size_t obj_size = obj->instance_size();
  66. obj->~base();
  67. pop_ptr += obj_size;
  68. }
  69. return 0;
  70. }
Success #stdin #stdout 0s 4284KB
stdin
Standard input is empty
stdout
A (sizeof=8) created at offset 0.
B (sizeof=40) created at offset 8.
C (sizeof=8) created at offset 48.
Hi from A!
*A destroyed*
Hi from B, Rika!
*B destroyed*
C says for you to go fuck yourself. >_<
*C destroyed*