這幾天學習智能指針時,自己在練習寫個管理數組指針的類時碰到了通過數組指針獲取數組個數的問題 1.在網上查詢了通過數組指針獲取數組個數的方法,對於自定義數據在前四個節點保存了數組個數 Student* pAry = new Student[3]; size_t num = *((size_t*)pAr ...
這幾天學習智能指針時,自己在練習寫個管理數組指針的類時碰到了通過數組指針獲取數組個數的問題
1.在網上查詢了通過數組指針獲取數組個數的方法,對於自定義數據在前四個節點保存了數組個數
Student* pAry = new Student[3]; size_t num = *((size_t*)pAry - 1);//3
測試是成功的,但是是對於內置數據類型int,double,char等就不成功了
2.又暈菜了,又在網上查找,最後獲得了_msize()這麼個函數,獲取New出來的內置數據在堆中的記憶體塊大小,不由就眼前一亮,有記憶體大小還愁不知道數組個數?
template<typename T> void GetSize(T* pArray) { int s= _msize(pArray) / sizeof(T); } //測試int int *pAry = new int[5]; GetSize(pAry);//獲得5個 //char char *pAry = new char[11]; GetSize(pAry);//獲得11 //union 這個要註意不能包括對象,可以是對象指針 MyUnion *pAry = new MyUnion[11]; GetSize(pAry);//獲得11
這也成功了,反正是內置的數據類型都可以計算出來,
總結一下,
1.內置數據類型用_msize()能獲得數組在堆中的記憶體大小,再通過計算獲得數組個數,
註意的是共用體中不能包括對象,不然出錯,可以是對象指針
2.關於自定義類型數組,就要用獲取對象數組的指針前四個位元組來獲取數組個數
自定義類型不就是.struct 結構體,class 類,union 共用體嗎,除掉共用體就只有二個,
所以,最後的函數寫成如下.
template<typename T> int GetSize(T* pArray) { const char* pname = typeid(T).name(); //獲得類型名稱 int s = 0; //檢查是否是結構體sturct 或是類class if (strstr(pname, "struct") || strstr(pname, "class")) { s = *((size_t*)pArray - 1); //獲取對象數組個數 } else { s = _msize(pArray) / sizeof(T); //獲取內置數據數組個數 } return s; }
測試最後都能獲得正確的數組個數
我在windows上用vs2017測試的,大家都可以測試下,看有哪不足的地方請告訴我,謝謝!