qt string内带变量_Qt入门教程(6) 局部变量元素加入成员变量QList后,局部变量出了作用域后,为什么QList仍然可以获取元素的值 | 阿拉灯...

问题

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

实验

#include

#include "mainwindow.h"

#include

#include

#include

struct tagTEST

{

int a;

QLabel *x;

};

QList testFunc()

{

QList testList;

tagTEST tmp;

qDebug()<

for(int i=0; i<10; i++)

{

tmp.a = i;

tmp.x = new QLabel(QString::number(i));

testList.append(tmp);

qDebug()<

}

qDebug()<

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()<

qDebug()<

for(i=0; i

{

qDebug()<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中的指针地址一样,说明只是进行了浅拷贝。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值