在范围外,称为上课的灾徒

called destructors for class during going out of scope

本文关键字:范围      更新时间:2023-10-16

下面有一块代码,这使我感到困惑:

class Simple 
 {
   private:
    int m_nID;
   public:
     Simple(int nID)
     {
      std::cout << "Constructing Simple " << nID<< std::endl;
      m_nID = nID;
     }
    ~Simple()
     {
     std::cout << "Destructing Simple" << m_nID << std::endl;
     } 
    int GetID() { return m_nID; }
 };
typedef struct player 
 {
   char                         id;
   char                         nick[30];
   std::vector<Simple>          mVector;
 } player, *PPER_player;
 int main()
 {
   Simple Simple1(1); // allocating on stack
   Simple Simple2(2);
   Simple Simple3(3);
   player stackplayer; 
   stackplayer.mVector.push_back(Simple1);
   stackplayer.mVector.push_back(Simple2);
   stackplayer.mVector.push_back(Simple3);
  return 0;
} 

当我运行它时,这是输出:

 Constructing Simple 1
 Constructing Simple 2
 Constructing Simple 3
 Destructing Simple1
 Destructing Simple1
 Destructing Simple2
 Destructing Simple1
 Destructing Simple2
 Destructing Simple3
 Destructing Simple3
 Destructing Simple2
 Destructing Simple1

当Simple1,Simple2,Simple3脱离范围时,为什么将破坏者称为多次?如您所见,Simple1的Destructor甚至被称为4次,仅适用于Simple3 2等。

您可以对此提供一些启示?

构造函数的这三个调用

Constructing Simple 1
Constructing Simple 2
Constructing Simple 3

对应于语句

   Simple Simple1(1); // allocating on stack
   Simple Simple2(2);
   Simple Simple3(3);

然后说明

   stackplayer.mVector.push_back(Simple1);

执行隐式定义的复制构造函数。

此语句

   stackplayer.mVector.push_back(Simple2);

是执行的,然后矢量重新定位内存。在内存的新范围内,它使用复制构造函数来复制第一个元素,同时在内存的前面删除了元素。

 Destructing Simple1

语句

   stackplayer.mVector.push_back(Simple3);

再次执行矢量,分配了新的内存范围,并在其中复制了两个元素。因此,这些破坏者的调用

 Destructing Simple1
 Destructing Simple2

对应于此操作。

退出主对象堆叠器的范围后;被删除。这些destructor与此操作相关的调用

 Destructing Simple1
 Destructing Simple2
 Destructing Simple3

和终于本地对象Simple1,Simple2和Simple3以相反顺序相对于其创建

的顺序删除
 Destructing Simple3
 Destructing Simple2
 Destructing Simple1

,因为向量存储了您传递给它的每个对象的副本,因此在这里创建的对象比您看到的
。同样,向量可以免费创建其商店的对象的许多副本,并且根据标准对此没有任何限制。通常,当向量需要重新放置其内容时,就会发生。