C++ 需要了解STL向量的帮助(消息体中的简单代码)

C++ 需要了解STL向量的帮助(消息体中的简单代码),c++,stl,vector,C++,Stl,Vector,代码如下: #include <vector> #include <iostream> class A { public: A() { std::cout << __FUNCTION__ << "\n"; } ~A() { std::cout << __FUNCTION__ << "\n"; } A& operator=(const A&) { std::cout <<

代码如下:

#include <vector>
#include <iostream>

class A
{
public:
    A() { std::cout << __FUNCTION__ << "\n"; }
    ~A() { std::cout << __FUNCTION__ << "\n"; }

    A& operator=(const A&) { std::cout << __FUNCTION__ << "\n"; return *this;}
};

int main(int argc, char* argv[])
{
    std::vector<A> as;
    A a;
    as.push_back(a);
    as.push_back(a);
    return 0;
}
我知道第一行的输出是从创建“a”时起对c-tor的调用。其中一个打给d-tor的电话也属于a。 对A::~A()的其他三个调用是从哪里来的呢? 为什么打给d-tor的电话比打给c-tor的电话多? 容器在向其元素添加副本时如何克隆“a”?
最后,是定义了输出实现还是有其他可能的输出?

您需要添加一个复制构造函数:

 A( const A& ) { std::cout << __FUNCTION__ << "\n"; }

A(const A&){std::cout您需要添加一个复制构造函数:

 A( const A& ) { std::cout << __FUNCTION__ << "\n"; }

A(const A&){std::cout要了解发生了什么,您在A中缺少了一个方法:

A(const A&) { std::cout << __FUNCTION__ << "(const A&)\n"; }
发生的情况是,对于每个push_back,向量分配一个新的连续数组,复制旧内容并销毁它。如果计算,第一个复制构造函数用于第一个push_back,第二个和第三个用于下一个push_back。第一个析构函数用于第二个push_back,第二个用于销毁向量,最后一个用于销毁变量a


顺便说一句,这是完全由实现定义的,因为它允许按块分配,这将防止相当多的复制/破坏。您甚至可以自己使用
vector::reserve(size\u type n)

来理解发生了什么,在一个

A(const A&) { std::cout << __FUNCTION__ << "(const A&)\n"; }
发生的情况是,对于每个push_back,向量分配一个新的连续数组,复制旧内容并销毁它。如果计算,第一个复制构造函数用于第一个push_back,第二个和第三个用于下一个push_back。第一个析构函数用于第二个push_back,第二个用于销毁向量,最后一个用于销毁变量a


顺便说一句,这是完全实现定义的,因为它允许按块分配,这将防止相当多的复制/破坏。您甚至可以自己使用
vector::reserve(size\u type n)

来分配块,因为我确信您意识到您正在创建“a”对象,然后使用复制构造函数将它们复制到数组中(如其他答案所示)

如果你的对象是他们拥有的数据的真实数据对象,或者难以复制的复杂状态,你可能需要考虑在数组中存储指针而不是直接存储对象。那么,你需要自己管理内存,但这是一个值得考虑的问题。

int main(int argc, char* argv[])
{
    std::vector<A*> as;
    A *a = new A();
    as.push_back(a);
    as.push_back(a);
    return 0;
}

因为只创建了对象的一个实例,而数组只是存储指针的副本。显然,在某个时候,您需要通过对象的一个指针删除对象本身,以确保最终获得内存。

因为我确信您意识到您正在创建“A”对象,然后使用复制构造函数将它们复制到数组中(如其他答案所示)

如果你的对象是他们拥有的数据的真实数据对象,或者难以复制的复杂状态,你可能需要考虑在数组中存储指针而不是直接存储对象。那么,你需要自己管理内存,但这是一个值得考虑的问题。

int main(int argc, char* argv[])
{
    std::vector<A*> as;
    A *a = new A();
    as.push_back(a);
    as.push_back(a);
    return 0;
}
由于只创建了对象的一个实例,而数组只是存储指针的副本。显然,在某个时候,您需要通过对象的一个指针删除对象本身,以确保最终获得内存