gpt4 book ai didi

c++ - 在超出范围期间调用类的析构函数

转载 作者:行者123 更新时间:2023-11-30 04:09:15 25 4
gpt4 key购买 nike

下面有一段代码,看得我一头雾水:

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 的析构函数甚至被调用了 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);

被执行然后 vector 重新分配内存。在新的内存范围内,它使用复制构造函数复制第一个元素,同时删除先前内存范围内的元素。

 Destructing Simple1

当声明

   stackplayer.mVector.push_back(Simple3);

被执行后,vector 再次分配一个新的内存范围并复制其中的两个元素。所以这些析构函数的调用

 Destructing Simple1
Destructing Simple2

对应这个操作。

当退出主对象stackplayer的范围后;被删除。析构函数的这些调用对应于此操作

 Destructing Simple1
Destructing Simple2
Destructing Simple3

最后,本地对象Simple1、Simple2、Simple3按照创建顺序的逆序被删除

 Destructing Simple3
Destructing Simple2
Destructing Simple1

关于c++ - 在超出范围期间调用类的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com