fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <cstdlib>
  4. #include <functional>
  5. #include <new>
  6.  
  7. bool memory_verbose = false;
  8. void *operator new(std::size_t size)
  9. {
  10. auto ptr = std::malloc(size);
  11. if (memory_verbose)
  12. std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
  13. return ptr;
  14. }
  15.  
  16. void *operator new(std::size_t size, const std::nothrow_t&)
  17. {
  18. auto ptr = std::malloc(size);
  19. if (memory_verbose)
  20. std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
  21. return ptr;
  22. }
  23. /*
  24. void *operator new[](std::size_t size)
  25. {
  26.   auto ptr = std::malloc(size);
  27.   if (memory_verbose)
  28.   std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
  29.   return ptr;
  30. }
  31. void *operator new[](std::size_t size, const std::nothrow_t&)
  32. {
  33.   auto ptr = std::malloc(size);
  34.   if (memory_verbose)
  35.   std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
  36.   return ptr;
  37. }
  38. */
  39. void operator delete(void* ptr) noexcept
  40. {
  41. if (memory_verbose)
  42. std::cout << __PRETTY_FUNCTION__ << ":" << ptr << std::endl;
  43. return std::free(ptr);
  44. }
  45. /*
  46. void operator delete[](void* ptr) noexcept
  47. {
  48.   if (memory_verbose)
  49.   std::cout << __PRETTY_FUNCTION__ << ":" << ptr << std::endl;
  50.   return std::free(ptr);
  51. }
  52. */
  53.  
  54. struct FlagGuard
  55. {
  56. public:
  57. FlagGuard(bool& flag, bool newValue = true) : flagRef(flag), flagBack(flag) { flag = newValue; }
  58. ~FlagGuard() { flagRef = flagBack; }
  59. private:
  60. bool& flagRef;
  61. bool flagBack;
  62. };
  63.  
  64. int main()
  65. {
  66. std::cout << sizeof(std::function<void(std::ostream&)>) << std::endl;
  67. std::cout << sizeof(void(*)(std::ostream&)) << std::endl;
  68. {
  69. FlagGuard fg(memory_verbose);
  70. auto p = new(std::nothrow) char[100];
  71. delete [] p;
  72. }
  73. {
  74. FlagGuard fg(memory_verbose);
  75. std::function<void(std::ostream&)> l1 = [](std::ostream& os) { os << "No capture\n"; };
  76. l1(std::cout);
  77. }
  78. {
  79. FlagGuard fg(memory_verbose);
  80. int a = 7;
  81. std::function<void(std::ostream&)> l1 = [a](std::ostream& os) { os << "Capture[a=" << a << "]\n"; };
  82. std::cout << sizeof(a) << std::endl;
  83. l1(std::cout);
  84. }
  85. {
  86. FlagGuard fg(memory_verbose);
  87. struct VLS
  88. {
  89. char bs[200] = "Very, very, , very, very, very, very, very, very, very, very, very, very, very, very, very, very, very long string";
  90. };
  91. VLS vls;
  92. std::function<void(std::ostream&)> l1 = [vls](std::ostream& os) { os << "Capture[vls=" << vls.bs << "]\n"; };
  93. l1(std::cout);
  94. }
  95. }
  96.  
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
16
4
void* operator new(std::size_t, const std::nothrow_t&):100:0x9e32008
void operator delete(void*):0x9e32008
void* operator new(std::size_t):1:0x9e32008
No capture
void operator delete(void*):0x9e32008
void* operator new(std::size_t):4:0x9e32008
4
Capture[a=7]
void operator delete(void*):0x9e32008
void* operator new(std::size_t):200:0x9e32018
Capture[vls=Very, very, , very, very, very, very, very, very, very, very, very, very, very, very, very, very, very long string]
void operator delete(void*):0x9e32018