• 10475阅读
  • 3回复

[提问]QMap问题,能否释放指针类型的内存空间 [复制链接]

上一主题 下一主题
离线txwhhny
 

只看楼主 倒序阅读 楼主  发表于: 2011-12-13
  1. struct Student
  2. {
  3.     int num;
  4.     char name[1024];
  5. };
  6. QMap<int, Student*> mapStudent1;
  7. QMap<int, Student> mapStudent2;
  8. void insert1()
  9. {
  10.     Student * pStu = NULL;
  11.     for (int i = 0; i < 1024; i++)
  12.     {
  13.         pStu = new Student;
  14.         mapStudent1.insert(i, pStu);
  15.     }
  16. }
  17. void insert2()
  18. {
  19.     for (int i = 0; i < 1024; i++)
  20.     {
  21.         Student stu;
  22.         mapStudent2.insert(i, stu);  // 这里insert的应该不是stu的引用吧,因为此时的stu应该是出于栈上的。
  23.     }
  24. }
  25. int main()
  26. {
  27.     mapStudent1.clear(); // 这里map会自动释放掉每个元素里面指针所对应的内存空间么
  28.     mapStudent2.clear();
  29.     return 0;
  30. }

以上的代码我测试过了,mapStudent1的元素,如果我手动delete的话会提示重复free,但是我不手动delete,在调用完clear()后内存空间没有减少。而mapStudent2在调用了clear()之后,内存空间有减少,但是还是不能减到inser1之前。
离线roywillow

只看该作者 1楼 发表于: 2011-12-13
QMap并没有义务为其成员进行内存管理啊
所以说是不会delete的,不管从哪个方面来想……

重复delete应该是你的代码的问题了吧
无法恢复到之前的内存占用应该是map提前预留的空间比最初大了,毕竟往里放过东西

专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 2楼 发表于: 2011-12-13
回 楼主(txwhhny) 的帖子
建议纯数据类用基于值的容器。必须用指针,只好自己delete,或者继承QObject使用Qt的自动删除功能。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线xlttap

只看该作者 3楼 发表于: 2011-12-16
用qDeleteAll()就可以了
我简单我快乐
快速回复
限100 字节
 
上一个 下一个