
关于C++STL中的vector,可否把类对象当做元素
一般用vector存储类对象时都用以下的形式:classA{};vector<A>v1;Aa;v1.push_back(a);这种事静态的加入;还可以动态加入:vecto...
一般用vector存储类对象时都用以下的形式:
class A
{};
vector<A> v1;
A a;
v1.push_back(a);
这种事静态的加入;
还可以动态加入:
vector<A*> v2
v2.push_back(&new A());
但是我想直接用vector<A>这种形式动态添加,vector<A> v3;
v3.push_back(A());
这样编译器是通过的,但我想知道这里用的是静态空间还是动态空间,如果是静态空间,是不是vector中保存的是A()的一个副本,而真正的A的对象是一个没有名字的A()? 展开
class A
{};
vector<A> v1;
A a;
v1.push_back(a);
这种事静态的加入;
还可以动态加入:
vector<A*> v2
v2.push_back(&new A());
但是我想直接用vector<A>这种形式动态添加,vector<A> v3;
v3.push_back(A());
这样编译器是通过的,但我想知道这里用的是静态空间还是动态空间,如果是静态空间,是不是vector中保存的是A()的一个副本,而真正的A的对象是一个没有名字的A()? 展开
2个回答
展开全部
你的“动态加入”的代码很有问题,最好不要用。
其一,vector<A*>中存的是指针,如果class A有析构函数,copy,move,delete都会出问题。
其二,new A()返回的是一个指针,不需要使用&运算符。
vector<A> v3;
v3.push_back(A());
没有问题,使用的是stack,不是heap。v3中存的是一个副本。具体过程:
1. 创建一个临时的A对象
2. 如果v3有足够的空间,将A对象复制到v3对应的空间(使用赋值函数assignment function);
如果v3没有足够的空间,先扩容,再创建一个A对象(使用拷贝函数copy constructor)。
3. 然后,临时的A被销毁
这种方法没有任何问题,既不存在内存泄漏,也不存在析构函数不被调用的问题。
其一,vector<A*>中存的是指针,如果class A有析构函数,copy,move,delete都会出问题。
其二,new A()返回的是一个指针,不需要使用&运算符。
vector<A> v3;
v3.push_back(A());
没有问题,使用的是stack,不是heap。v3中存的是一个副本。具体过程:
1. 创建一个临时的A对象
2. 如果v3有足够的空间,将A对象复制到v3对应的空间(使用赋值函数assignment function);
如果v3没有足够的空间,先扩容,再创建一个A对象(使用拷贝函数copy constructor)。
3. 然后,临时的A被销毁
这种方法没有任何问题,既不存在内存泄漏,也不存在析构函数不被调用的问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询