Разрешено ли STL вызывать деструктор более одного раза для элемента контейнера - PullRequest
0 голосов
/ 07 сентября 2011

В основном у меня странная проблема, у меня есть структура Node, которая наследуется от контрструктуры. И в структуре счетчика у меня есть эта проверка, чтобы "убедиться", что Destructor вызывается только на выделенной памяти и что он вызывается только один раз.

static atomic < int > check;

counter()
      {
          check=42;
//...
      }

 ~counter() 
    {
        if (check!=42)
        {
            cout<<"ouch"<< typeid(T).name()<<"  "<< check<<"  "<< objects_created<< endl;
            sleep(1);
            assert(0);
        }
        check=84;
     //...
    }

и он ломается при компиляции с g ++ 4.6

3  0x00007ffff65ec7a4 in counter<Node>::~counter (this=0x614c60, 
    __in_chrg=<value optimized out>)
    at /home...


4  0x00007ffff65e7a4d in Node::~Node (this=0x614c60, 
    __in_chrg=<value optimized out>)
    at /home...


5  0x00007ffff6603cf2 in std::_Destroy<Node> (__pointer=0x614c60)
    at /usr/include/c++/4.6/bits/stl_construct.h:92


6  0x00007ffff6600004 in std::_Destroy_aux<false>::__destroy<Node*> (
    __first=0x614c60, __last=0x614d40)
    at /usr/include/c++/4.6/bits/stl_construct.h:102


7  0x00007ffff65fa003 in std::_Destroy<Node*> (__first=0x614c60, 
    __last=0x614d40) at /usr/include/c++/4.6/bits/stl_construct.h:125


8  0x00007ffff65f2a4f in std::_Destroy<Node*, Node> (__first=0x614c60, 
    __last=0x614d40) at /usr/include/c++/4.6/bits/stl_construct.h:151


9  0x00007ffff65ecfb2 in std::vector < Node, std::allocator < Node>
>::~vector (
    this=0x7ffff68329f8, __in_chrg= < value optimized out>)
    at /usr/include/c++/4.6/bits/stl_vector.h:348

1 Ответ

3 голосов
/ 07 сентября 2011

check является статическим, что означает, что он является общим для всех экземпляров класса.Поскольку вы хотите, чтобы check был обычным членом класса, вы должны удалить ключевое слово static.

...