向量,班级和破坏者

Vectors, Classes, and Destructors

本文关键字:破坏者 向量      更新时间:2023-10-16

这是我的班级

#include <iostream>
#include <vector>
class Base
{
public:
    Base (int ind = 3)
    :m_ind(ind)
    {
        std::cout<<"Base ()"<<std::endl;
    }
    virtual ~Base ()
    {
        std::cout<<"~Base ()"<<std::endl;
    }
};

我在MAIN中尝试了此代码:

 Base(6)//literal base
  • 创建了一个"文字"基础,编译器打印"Base ()"
  • 由于它不是一个变量,因此,当编译器移出时,只有一些内存,它将删除分配给它的内存
  • 编译器将打印"~Base ()"

我尝试以主要运行此代码:

std::vector<Base>vec;
vec.push_back(Base(4));

我期望的是:

  • 编译器创建Base(4)并将其存储在vec.at(0)
  • 执行的构造函数和"Base ()"在屏幕上打印
  • 当主函数末端"~Base ()"打印在屏幕上

我得到的:

  • 编译器创建Base(4)并将其存储在vec.at(0)
  • 执行的构造函数和"Base ()"在屏幕上打印
  • 编译器移出并执行了DESTRUCTOR "~Base ()"已打印
  • 主要功能末端和"~Base ()"打印

这意味着将Base(4)删除时被删除,但是如果vec.at(0)是基础(它在向量内部并且尚未删除),那么这是怎么可能的)

vec.push_back(Base(4));

您创建临时对象。此临时对象将传递给 copies 将其移动到向量的push_back函数(调用A 复制构造函数移动构造函数在您的班上)。然后 push_back函数返回,临时对象被破坏。

后来,当向量本身破坏时,向量内的副本将被破坏。

您省略了Base复制构造函数。尽管您没有写一个,但编译器为您提供了一个默认的。如果添加复制构造函数,您会看到它被调用(将临时Base(4)复制到向量时):

#include <iostream>
#include <vector>
class Base
{
public:
    Base(int)
    {
        std::cout<<"Base(int)"<<std::endl;
    }
    Base(const Base&)
    {
        std::cout<<"Base(Base)"<<std::endl;
    }
    virtual ~Base ()
    {
        std::cout<<"~Base()"<<std::endl;
    }
};

int main()
{
    std::vector<Base>vec;
    vec.push_back(Base(4));
}

这会产生:

Base(int)
Base(Base)
~Base()
~Base()

如果您使用emplace_back而不是push_back,您会发现仅构建了一个实例。它没有复制:

int main()
{
    std::vector<Base>vec;
    vec.emplace_back(4);
}
Base(int)
~Base()