躺_ 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的实现有关系。

    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误