例如:
struct structInfo{
int a;
int b;
};
struct structInfoVector{
vector<structInfo> vec;
};
int main(){
structInfoVector* Test1 = new structInfoVector;
structInfo p1;
Test1->vec.push_back(p1); //第一种情况
structInfo* p2 = new structInfo;
Test1->vec.push_back(*p2); //第二种情况
structInfoVector Test2;
structInfo p3;
Test2.vec.push_back(p3); //第三种情况
structInfo* p4 = new structInfo;
Test2.vec.push_back(*p4); //第四种情况
return 0;
}
例如这四种情况, 能否告知当前各个变量的内存位置?
以及当vector很大, 必须要放到堆里时, 通常结构体如何声明?
第一种情况:Test1变量通过new
创建,因此,Test1存放位置是堆,并且Test1->vec 也在堆里面
p1是一个局部变量,存放位置为栈,p1被push_back
到vec中,该过程是一个拷贝构造的过程,被push_back
进入的p1变量在vec内部是p1的副本,并且是放在堆里面的。
第二种情况:p2是new
出来的对象,因此,p2是放在堆里面的
vec中的p2和第一种情况的p1一样
第三种情况:Test2是局部变量,因此Test2是在栈里面的,Test2->vec也是在栈里面
其他变量的情况同第一种情况
第四种情况:p4同第二种情况中的p2
structInfoVector::vec是一个成员变量,因此它在栈中还是在堆中是由structInfoVector的位置决定的。
由于vec中所保存的元素是structInfo对象类型而非指针,所以push_back
只接受对象类型,而且该过程是拷贝构造的过程,与实参是什么类型没有关系。 并且保存在vec中的structInfo对象都是在堆里面的,这个和vec的实现有关系。