[MinGW-Notify] [mingw] #40686: std::string custom operator new/delete function

Back to archive index
MinGW Notification List mingw****@lists*****
Fri Sep 4 19:57:56 JST 2020


#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



More information about the MinGW-Notify mailing list
Back to archive index