首页 > 其他分享 >局部变量元素加入成员变量QList后,局部变量出了作用域后,为什么QList仍然可以获取元素的值(转)

局部变量元素加入成员变量QList后,局部变量出了作用域后,为什么QList仍然可以获取元素的值(转)

时间:2023-05-20 19:11:20浏览次数:43  
标签:tmp 局部变量 元素 list value QList QLabel

问题

问题:现有一个成员变量QList,在函数中定义了一个局部变量的对象,并将该局部变量加入到QList中。当函数运行结束,局部变量也就出了作用域,这时,由于局部变量只是一个普通对象,而不是指针,所以,应该被销毁。但是,我们在外面仍然可以通过QList对象来访问之前加入进来的数据,这是为什么?

实验

#include <QApplication>
#include "mainwindow.h"
#include <QDebug>
#include <QLabel>
#include <QString>
 
struct tagTEST
{
    int a;
    QLabel *x;
};

QList testFunc()
{
    QList  testList;
    tagTEST tmp;
    qDebug()<<"before add list:";
    for(int i=0; i<10; i++)
    {
       tmp.a = i;
       tmp.x = new QLabel(QString::number(i));
       testList.append(tmp);
       qDebug()<<i<<"  a value:"<<tmp.a<<"  x value:"<<tmp.x;
    }
    qDebug()<<"before add list size:"<<testList.size();
    return testList;
}


int main(int argc,char *argv[])
{
    QFont f("ZYSong18030",10);
    QApplication::setFont(f);
    QApplication app(argc,argv);

    QList list = testFunc();
    int size = list.size();
    int i;
    qDebug()<<"after add list:";
    qDebug()<<"after add list size:"<<size;
    for(i=0; i<size; i++)
    {
        qDebug()<<i<<"  a value:"<<list[i].a<<"  x value:"<<list[i].x; } MainWindow *mainwindow = new MainWindow(); mainwindow->show();
    return app.exec();
}

运行结果

before add list: 
0   a value: 0   x value: QLabel(0x3cad0) 
1   a value: 1   x value: QLabel(0x3cd30) 
2   a value: 2   x value: QLabel(0x3cbf0) 
3   a value: 3   x value: QLabel(0x3cb90) 
4   a value: 4   x value: QLabel(0x3ccf0) 
5   a value: 5   x value: QLabel(0x3cd10) 
6   a value: 6   x value: QLabel(0x3cd90) 
7   a value: 7   x value: QLabel(0x3ca90) 
8   a value: 8   x value: QLabel(0x3cdd0) 
9   a value: 9   x value: QLabel(0x3cc90) 
before add list size: 10 
after add list: 
after add list size: 10 
0   a value: 0   x value: QLabel(0x3cad0) 
1   a value: 1   x value: QLabel(0x3cd30) 
2   a value: 2   x value: QLabel(0x3cbf0) 
3   a value: 3   x value: QLabel(0x3cb90) 
4   a value: 4   x value: QLabel(0x3ccf0) 
5   a value: 5   x value: QLabel(0x3cd10) 
6   a value: 6   x value: QLabel(0x3cd90) 
7   a value: 7   x value: QLabel(0x3ca90) 
8   a value: 8   x value: QLabel(0x3cdd0) 
9   a value: 9   x value: QLabel(0x3cc90)

得出结论

说明append函数在内部进行了数据的复制,并且这种复制只是浅拷贝,因为list中每个元素的x指针和tmp中的指针地址一样,说明只是进行了浅拷贝。

Qt入门教程(6) 局部变量元素加入成员变量QList后,局部变量出了作用域后,为什么QList仍然可以获取元素的值

图中,从刚开始,在函数中创建tmp元素时,分别在堆和栈上分别创建了数据,加入list之后,将原来tmp中的在栈上面的元素进行了浅拷贝,x指向的依旧是tmp中的那个内存,但是,元素添加进list之后,元素的作用域扩大了,因此,当函数运行结束后,tmp被销毁,但tmp所指向的内存空间依旧在,我们依然在外面通过list访问中的数据

http://www.lgwimonday.cn/archives/1397

标签:tmp,局部变量,元素,list,value,QList,QLabel
From: https://www.cnblogs.com/xihong2014/p/17417649.html

相关文章

  • Selenium-元素定位的方法
    在使用selenium进行自动化时,定位元素是一项常见而重要的任务。准确地选择元素是测试流程中的关键一步。本文将介绍常用的元素定位方法,帮助你更好地理解和应用这些方法。选择元素的方法元素的定位方法有多种,可以根据元素的特征进行选择。下面是一些常用的元素定位方法:ID定位:......
  • 类 方法中实现查找某元素是否在数组中的操作
    publicclassImoocStudent{publicbooleancontains(int[]arr,intelement){booleanresult=false;for(intvalue:arr){if(value==element){result=true;break;}......
  • Vue.js学习记录之在元素与template中使用v-if指令实例(转贴)
    语法比较简单,直接上代码:<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head> <title></title> <scriptsrc="https://cdn.bootcss.com/vue/2.2.2/vue.......
  • python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法
    前言排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。本文主要讲述python中经常用的三种排序算法,选择排序法,冒泡排序法和插入排序法及其区别。通过对列表里的元素大小排序进行阐述。一、选择排序法选择......
  • 使用details和summary元素实现树形展示
    1.先看效果2.默认是关闭的,并且父级关闭后,子级的开关状态会被保留,再次展开时,可恢复;3.需要对details元素增加一个padding-left或margin-left,否则展开后,子级和父级是左对齐的,视觉效果不好;4.一般是details元素套一个summary元素和一个展开后要展示的内容,如果details中没有sum......
  • 2654. 使数组所有元素变成 1 的最少操作次数(c++,gcd性质)
    题目链接:2654.使数组所有元素变成1的最少操作次数方法一:计算最短的gcd为1的子数组解题思路本题目标:使得所有的数组元素都变为\(1\),通过求相邻元素\(gcd\)将其赋值给一方的方式;思路:若想操作数最少,那么就是不为\(1\)的数\(x\)和1求\(gcd\),即\(x=gcd(x,1)\),......
  • JVM(四)虚拟机栈(一)栈帧结构:局部变量表与操作数栈
    JVM(四)虚拟机栈(一)栈帧结构:局部变量表与操作数栈1虚拟机栈1.1简介虚拟机栈出现的背景:由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能基于寄存器。这样做的优点是跨平台,指令集更小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。......
  • 免注意力Transformer (AFT):使用逐元素乘积而不是点积
    注意力机制作为现代深度学习模型的基石,能够毫不费力地对长期依赖进行建模,并关注输入序列中的相关信息。然而,需要点积自注意力-广泛使用在Transformer架构中的一个关键组件-已被证明在序列长度方面具有二次空间复杂度,因此不适用于处理长输入。在本文中,我们介绍了AttentionFree......
  • 使用CSS选择器进行元素定位
          在seleniumwebdriver中,支持使用CSS选择器来进行元素定位,事实在真的投入工作,大量编辑用例和元素定位的时候,使用css和xpath才是经常需要用到的。之前有专门讲过使用xpath对元素定位的使用,下面要介绍css选择器来进行元素定位。【参见W3C官网说明】http://www.w3schoo......
  • HTML 里 img 元素的 src 和 srcset 属性有何区别?
    在HTML中,img元素通常用于在网页中插入图片。img元素有两个相关的属性:src和srcset。src属性指定图像的URL,它是必需的。浏览器将使用该URL加载图像并将其显示在页面上。srcset属性允许您指定一系列不同大小或分辨率的图像文件,以便浏览器可以根据设备的像素密度和屏幕大......