#40686: std::string custom operator new/delete function Open Date: 2020-08-30 18:32 Last Update: 2020-09-04 16:45 URL for this Ticket: https://osdn.net//projects/mingw/ticket/40686 RSS feed for this Ticket: https://osdn.net/ticket/ticket_rss.php?group_id=3917&tid=40686 --------------------------------------------------------------------- Last Changes/Comment on this Ticket: 2020-09-04 16:45 Updated by: marvol Comment: So, you think it is because the implementation of the std::string is in an external dll? It may explain that my operator new was not called. Indeed, If I compile it with the "-static" linker option my operator new/delete is called. But why was my operator delete called? Is it because the compiler optimized the std::string destroy function to be inlined? I am thinking about the experience that I had with std::vector - maybe it is because the std::vector is a template that is compiled with the source. --------------------------------------------------------------------- Ticket Status: Reporter: marvol Owner: (None) Type: Issues Status: Open Priority: 1 - Lowest MileStone: (None) Component: GCC Severity: 1 - Lowest Resolution: Works For Me --------------------------------------------------------------------- Ticket details: Hello, I am writing a custom wrapper for new/delete allocations to get an aligned memory. I noticed that if I use std::string, operator new/delete are not called as it is in a linux version of g++ (operators new/delete are called). With the default optimization level, operator new/delete is not called and with optimization levels O1, O2, O3 only operator delete is called. Source: 1. #include <string> 2. #include <cstdio> 3. #include <cstdlib> 4. 5. void* operator new(size_t size) 6. { 7. printf("Calling new: %zu", size); 8. void* address = malloc(size); 9. 10. printf(" address: 0x%p\n", address); 11. return address; 12. } 13. 14. void* operator new[](size_t size) 15. { 16. printf("Calling new[]: %zu", size); 17. void* address = malloc(size); 18. 19. printf(" address: 0x%p\n", address); 20. return address; 21. } 22. 23. void operator delete(void* address) 24. { 25. printf("Calling delete, address: 0x%p\n", address); 26. free(address); 27. } 28. 29. void operator delete[](void* address) 30. { 31. printf("Calling delete[], address: 0x%p\n", address); 32. free(address); 33. } 34. 35. struct Obj 36. { 37. std::string m_str; 38. }; 39. 40. void test() 41. { 42. Obj obj; 43. obj.m_str = "long string ......................"; 44. } 45. 46. int main() 47. { 48. test(); 49. 50. return 0; 51. } Compiling with the default optimization level: • g++ main.cpp -std=c++11 -o test.exe Output: • NONE Compiling with the O2 optimization level: • g++ main.cpp -std=c++11 -O2 -o test.exe Output: • Calling delete, address: 0x00542098 I am using: • OS: Windows 7 • Mingw: 5.4.1 • Shell: cmd MINGW32_NT-6.1 MARTIN-LENOVO 1.0.18(0.48/3/2) 2012-11-21 22:34 i686 Msys • Uname -a: • G++: g++ (MinGW.org GCC Build-2) 9.2.0 • GCC: gcc (MinGW.org GCC Build-2) 9.2.0 • ld: GNU ld (GNU Binutils) 2.32 -- Ticket information of MinGW - Minimalist GNU for Windows project MinGW - Minimalist GNU for Windows Project is hosted on OSDN Project URL: https://osdn.net/projects/mingw/ OSDN: https://osdn.net URL for this Ticket: https://osdn.net/projects/mingw/ticket/40686 RSS feed for this Ticket: https://osdn.net/ticket/ticket_rss.php?group_id=3917&tid=40686