#include <stdio.h> 2007-06-13 12:38 補充: 經過試驗,C++版出爐了:)關鍵點還是在于placement new和顯示的析構函數(shù)調用,用于保證對象可以正常的構造和析構。 這個實現(xiàn)也還是有不少缺點的,比如,數(shù)組的大小必須記住,才能保證析構所有對象。不過這點可以通過改進分配方法算法,把數(shù)組大小也用一點空間保存起來。 另一個缺點是,從語法上看,很容易讓人誤把darray_new返回的指針以為是數(shù)據(jù)區(qū)的起始地址,從而可能導致一些邏輯錯誤。 #include <iostream> #include <cstdlib> #include <new> template <typename T> T **darray_new(int row, int col) { int size = sizeof(T); void **arr = (void **) malloc(sizeof(void *) * row + size * row * col); if (arr != NULL) { unsigned char * head; head = (unsigned char *) arr + sizeof(void *) * row; for (int i = 0; i < row; ++i) { arr[i] = head + size * i * col; for (int j = 0; j < col; ++j) new (head + size * (i * col + j)) T; } } return (T**) arr; } template <typename T> void darray_free(T **arr, int row, int col) { for (int i = 0; i < row; ++i) for (int j = 0; j < col; ++j) arr[i][j].~T(); if (arr != NULL) free((void **)arr); } 2007-06-13 21:00補充 本文僅為技術層面的討論,實踐中考慮用boost::multi_array之類的現(xiàn)成的解決方案可能會更有效。 |
|
來自: oskycar > 《c\vc\opencv》