躺_ 2020-04-16 16:56 采纳率: 0%
浏览 1452

C++ 结构体中有vector 当使用new或不用new构建结构体时, 被push_back的vector中元素的内存位置 堆or栈?

例如:

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很大, 必须要放到堆里时, 通常结构体如何声明?

  • 写回答

1条回答 默认 最新

  • Huoon 2020-04-19 15:52
    关注

    第一种情况: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的实现有关系。

    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏