li00020 发表于 2014-8-10 08:52:46

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

今天在调试代码的时候出现了一个很奇怪的bug:我在类的一个成员函数内的QHash里存了一对key和value,在同一个类里的另一个成员函数内通过key取出value,竟然是空也就是不存在这对<key,value>,真是太奇怪了,明明存储在里面,刚存放进去,我通过打印语句打印出来时存在的,在另一个成员函数内就没了。

具体代码:

//test.h

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



//test.cpp

Test::fun1()

{

groupHash=newQHash<QString,QString>();

groupHash.insert(groupName,groupID);



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

qDebug()<<""<<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是存在哪儿(stackor   heap)?

终于揭开了谜底:

如:A*a=newA;

局部的指针变量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上分配。

         总之,是基础不够牢固,要快速补习之。
页: [1]
查看完整版本: STL的hash和map本身以及其key、value是存在stack还是heap?