<div dir="ltr"><div>Hi all,<br></div><div><br>
    Consider the following code (full source code can be found in
    attachment)<br>
    <br>
    object.h<br>
    <blockquote type="cite">#define _DESTRUCTOR_IN_HEADER<br>
      <br>
      class Object<br>
      {<br>
      public:<br>
          Object();<br>
      #ifdef _DESTRUCTOR_IN_HEADER<br>
          ~Object()<br>
          {<br>
          }<br>
      #else<br>
          ~Object();<br>
      #endif<br>
      <br>
      private:<br>
          class Counter<br>
          {<br>
          public:<br>
              Counter()<br>
                  : _count(0)<br>
              {<br>
                  printf("Counter: %p %d\n", this, _count);<br>
              }<br>
      <br>
              ~Counter()<br>
              {<br>
                  printf("~Counter: %p %d\n", this, _count);<br>
              }<br>
      <br>
              void operator++()    { ++_count; }<br>
              void operator--()    { --_count; }<br>
      <br>
          private:<br>
              int _count;<br>
          };<br>
      <br>
          class Foo<br>
          {<br>
          public:<br>
              Foo() { ++counter(); }<br>
              ~Foo() { --counter(); }<br>
      <br>
          private:<br>
              Counter& counter()<br>
              {<br>
                  static Counter s_counter;<br>
                  return s_counter;<br>
              }<br>
          } foo;<br>
      };<br>
    </blockquote>
    object.cpp
    <blockquote type="cite">#include "object.h"<br>
      <br>
      Object::Object()<br>
      {<br>
      }<br>
      <br>
      #ifndef _DESTRUCTOR_IN_HEADER<br>
      Object::~Object()<br>
      {<br>
      <br>
      }<br>
      #endif</blockquote>
    <br>
    Build the source to a shared library (compile with
    -fvisibility-inlines-hidden flag),<br>
    uses in main (another module)<br>
    <blockquote type="cite">    Object *obj = new Object;<br>
          delete obj;</blockquote>
    you may see the strange output when running<br>
    <blockquote type="cite">Counter: 0x7f2ded933efc 0<br>
      Counter: 0x6012d4 0<br>
      ~Counter: 0x6012d4 -1<br>
      ~Counter: 0x7f2ded933efc 1</blockquote>
    <br>
    The Counter construct/destruct twice, the second one (Counter:
    0x6012d4 0) construct from<br>
     delete obj > Object::Foo::~Foo() > Object::Foo::counter()<br>
    <br>
    when comment out the line <b>#define _DESTRUCTOR_IN_HEADER </b>or
    remove the<b><br>
    </b><b>-fvisibility-inlines-hidden</b> flag, it works as expected<br>
    remove the compile flag<br>
    <blockquote type="cite">Counter: 0x6013a4 0<br>
      ~Counter: 0x6013a4 0</blockquote>
    comment out #define _DESTRUCTOR_IN_HEADER<br>
    <blockquote type="cite">Counter: 0x7f1eaa16629c 0<br>
      ~Counter: 0x7f1eaa16629c 0</blockquote>
    <br>
    A bit difference, as the address isn't the same (heap and stack)<br>
    <br>
    this code works with GCC (as least 5.2 as my test) with or without
    the -fvisibility-inlines-hidden<br>
    flag, of course it works with MSVC too.<br>
    <br>
    I don't known is this a bug with the flag or because the silly code
    makes it (as when constructor and<br>
    destructor defined in the same file, it works).<br><br></div><div>It seems that my last post failed, seems no body answers me, so I repost again, sorry.<br></div><div>If this is the wrong place, please let me know where to post, thanks.<br></div><div><br></div></div>