通过数组的指针获得数组个数

打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

 
这几天学习智能指针时,自己在练习写个管理数组指针的类时碰到了通过数组指针获取数组个数的问题
1.在网上查询了通过数组指针获取数组个数的方法,对于自定义数据在前四个节点保存了数组个数
  1. Student* pAry = new Student[3];
  2. size_t num = *((size_t*)pAry - 1);//3
复制代码
 

测试是成功的,但是是对于内置数据类型int,double,char等就不成功了
2.又晕菜了,又在网上查找,最后获得了_msize()这么个函数,获取New出来的内置数据在堆中的内存块大小,不由就眼前一亮,有内存大小还愁不知道数组个数?
  1. template<typename T>
  2. void GetSize(T* pArray)
  3. {
  4. int s= _msize(pArray) / sizeof(T);
  5. }
  6. //测试int
  7. int *pAry = new int[5];
  8. GetSize(pAry);//获得5个
  9. //char
  10. char *pAry = new char[11];
  11. GetSize(pAry);//获得11
  12. //union 这个要注意不能包括对象,可以是对象指针
  13. MyUnion *pAry = new MyUnion[11];
  14. GetSize(pAry);//获得11
复制代码
这也成功了,反正是内置的数据类型都可以计算出来,
总结一下,
1.内置数据类型用_msize()能获得数组在堆中的内存大小,再通过计算获得数组个数,
注意的是共用体中不能包括对象,不然出错,可以是对象指针
2.关于自定义类型数组,就要用获取对象数组的指针前四个字节来获取数组个数
自定义类型不就是.struct 结构体,class 类,union 共用体吗,除掉共用体就只有二个,
所以,最后的函数写成如下.
  1. template<typename T>
  2. int GetSize(T* pArray)
  3. {
  4. const char* pname = typeid(T).name(); //获得类型名称
  5. int s = 0;
  6. //检查是否是结构体sturct 或是类class
  7. if (strstr(pname, "struct") || strstr(pname, "class"))
  8. {
  9. s = *((size_t*)pArray - 1); //获取对象数组个数
  10. }
  11. else
  12. {
  13. s = _msize(pArray) / sizeof(T); //获取内置数据数组个数
  14. }
  15. return s;
  16. }
复制代码
 
测试最后都能获得正确的数组个数
我在windows上用vs2017测试的,大家都可以测试下,看有哪不足的地方请告诉我,谢谢!



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!

标签云

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