今天在调试代码的时候出现了一个很奇怪的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上分配。
总之,是基础不够牢固,要快速补习之。
参考:http://bbs.csdn.net/topics/390362568