#40686: std::string custom operator new/delete function Open Date: 2020-08-30 18:32 Last Update: 2020-09-03 15:31 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-03 15:31 Updated by: marvol Comment: Thank you for your reply. It is possible that I am missing something. I understand that std::string can have own implementation of allocation of the data. I think that in the current libstdc++ implementation if a length of the string is greater than 15 bytes, then it uses the heap for allocation. On line 43, there is an assignment operator for the string and this string is long enough to allocate string data on the heap. On the next line the object "obj" ends its lifetime so "obj" destructor is called, also with std::string destructor which releases the string data. For me it is strange that there is no 1 to 1 relation between calling operator new/delete (how should I release memory that was not allocated in my allocator?). I tried other containers like std::vector and they seem to be consistent. --------------------------------------------------------------------- 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