Send MinGW-Notify mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.osdn.me/mailman/listinfo/mingw-notify
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of MinGW-Notify digest..."
Please do not reply to this notification; the sender address is unable to
accept incoming e-mail. If you wish to unsubscribe you can do so at
https://lists.osdn.me/mailman/listinfo/mingw-notify.
Today's Topics:
1. [mingw] #40686: std::string custom operator new/delete
function (MinGW Notification List)
2. [mingw] #40686: std::string custom operator new/delete
function (MinGW Notification List)
----------------------------------------------------------------------
Message: 1
Date: Thu, 03 Sep 2020 15:31:19 +0900
From: MinGW Notification List <[email protected]>
To: OSDN Ticket System <[email protected]>
Subject: [MinGW-Notify] [mingw] #40686: std::string custom operator
new/delete function
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8
#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
------------------------------
Message: 2
Date: Thu, 03 Sep 2020 13:11:46 +0100
From: MinGW Notification List <[email protected]>
To: OSDN Ticket System <[email protected]>
Subject: [MinGW-Notify] [mingw] #40686: std::string custom operator
new/delete function
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8
#40686: std::string custom operator new/delete function
Open Date: 2020-08-30 10:32
Last Update: 2020-09-03 13:11
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 13:11 Updated by: keith
Comment:
You need to think about it some more. You are correct, in your belief that new
should be called ... indeed, it is, but it isn't your replacement that's even
considered. Think about where the std::string implementation is, and what that
implies for where it must find the implementation of new that it does call.
---------------------------------------------------------------------
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
------------------------------
Subject: Digest Footer
_______________________________________________
MinGW-Notify mailing list
[email protected]
https://lists.osdn.me/mailman/listinfo/mingw-notify
------------------------------
End of MinGW-Notify Digest, Vol 36, Issue 4
*******************************************