#40686: std::string custom operator new/delete function Open Date: 2020-08-30 10:32 Last Update: 2020-09-04 11:57 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 11:57 Updated by: keith Comment: Reply To marvol So, you think it is because the implementation of the std::string is in an external dll? Yes ... in fact, I know it to be so. It may explain that my operator new was not called. It does. There is a fundamental, and significant, difference between the properties of ELF shared objects, as used on Linux, and the equivalent PE-coff DLLs, as used on Windows. Do you know what it is? Indeed, If I compile it with the "-static" linker option my operator new/ delete is called. Actually, -static-libstdc++ is sufficient. But why was my operator delete called? Is it because the compiler optimized the std::string destroy function to be inlined? Yes. You can study the effect of differing optimization levels, by compiling with -S -o-, and examining the assembly output. At -O1 (and above), your Obj class object is optimized away, and your test function includes exactly one reference to a std::string method — likely a copy constructor — and then your delete operator code is called; at -O2 (and -O3) even the delete call is optimized away, and your code is in-lined. At no optimization level, is your new operator ever called, but it is likely that whatever new operator implementation std::string knows about is called, (by what I assume to be its cryptically named copy constructor). That, in itself, is disturbing, because you have a potentially incompatible new and delete pairing, at any optimization level of -O1 or above. 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. Maybe. You haven't shown me anything, which I might evaluate. --------------------------------------------------------------------- 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