看流星社区

 找回密码
 注册账号
查看: 2355|回复: 0

STL的hash和map本身以及其key、value是存在stack还是heap?

[复制链接]

该用户从未签到

发表于 2014-8-10 08:52:46 | 显示全部楼层 |阅读模式
今天在调试代码的时候出现了一个很奇怪的bug:我在类的一个成员函数内的QHash里存了一对key和value,在同一个类里的另一个成员函数内通过key取出value,竟然是空也就是不存在这对<key,value>,真是太奇怪了,明明存储在里面,刚存放进去,我通过打印语句打印出来时存在的,在另一个成员函数内就没了。

具体代码:

//test.h

   QHash<QString,QString> *groupHash;//我定义成了指针对象



//test.cpp

Test::fun1()

{

groupHash  =  new  QHash<QString,QString>();

groupHash.insert(groupName,groupID);



qDebug()<<"[key = ]"<<groupHash .key(groupID);//(1)

qDebug()<<"[value = ]"<<groupHash .value(groupName);//(2)

}



Test::fun2()

{

QString groupName  =  "*****";//在fun1中存储的

QString groupID = groupHash.value(groupName);

qDebug()<<"[groupID
= ]"<<groupID <<endl;//(3)

}

结果(1)、(2)处都能正确打印,而(3)处打印出来为空,什么都没有。

--------------------------------------------------------------------------------------

在stackoverflow中看到有大牛这样讲:

“There's no need (and it's highly unidiomatic) to create the QHash on the heap, it's implicitely shared. So it should read QHash<key,value> hash;”

大致意思就是:没必要在heap(堆)上创建QHash,它是隐式共享的。

后来我在google中搜了下     hash中key、value是存在哪儿(stack  or   heap)?

终于揭开了谜底:

如:A  *a  =  new  A;

局部的指针变量a本身是存放在stack中,而指针a所指向的内容是放在heap中的。即指针里的地址是属于heap区的,指针与它所管理的资源是放在不同的内存区中的。

而STL中的hash和map也和指针类似,hash/map变量(对象)本身是存放在stack中,而hash/map所管理的资源(key,value)是存放在stack中的,也就是不管hash/map的key和lue有多大,都不会影响stack的空间。

STL的hash/map底层也是靠指针分配<key, value>的内存的,不管你insert了几笔<key,value>,其占用的stack都不会因此而膨胀,因为<key,value>和
是存放在heap上的。

如:


1

2

3

4

5

template<typename T>

struct A

{

  T *data_;

}

STL的vector,map, hash或list底层都是透过指针来动态分配你要处理的资源--T的,所以他们的stack不会因为你放了很多个T就膨胀。

            不管你在map里面放的是什么type都好,map的资源都是在heap上分配的当你把资源往map里面放的时候,就代表你的资源是放在heap上的绝对不是在stack上分配。

         总之,是基础不够牢固,要快速补习之。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-30 19:00

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表