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;
}
由于只创建了对象的一个实例,而数组只是存储指针的副本。显然,在某个时候,您需要通过对象的一个指针删除对象本身,以确保最终获得内存