我想爲多維數組設計一個C++類。通過多維我的意思是1d,2d,3d等。該類支持按元素加法和標量乘法運算符。假設A和B是類的實例(尺寸相同的尺寸爲&)。我想使用的對象在表達這樣的:在C++中設計一個多維數組
C = A * 2 + B
我想知道的事情是如何管理內存。在上面的表達式中,A * 2將創建該類的臨時對象,稍後將其添加到B.反正,臨時對象在添加完成後是垃圾。我寫了下面的類,它很好地工作,但我很確定它泄漏了內存。現在我的問題是,
- 我該如何解決內存問題?什麼是設計課程的最佳方式?
是否可以在堆棧而不是堆上分配所需的內存?
class XArray { int num_dim; int *dims; int *index_helper; int table_size; double *table; public: XArray(const int n, const int *d):num_dim(n), dims(d) { int size = 1; for (int i = 0; i < n; i++) { size *= d[i]; } table_size = size; table = new double[size]; index_helper = new int[n]; }; ~XArray() { delete[] table; delete[] index_helper; }; int dim(int d) { return dims[d]; } double& operator()(int i) { index_helper[0] = i; return get_helper(1, index_helper); } double& operator()(int i, int j) { index_helper[0] = i; index_helper[1] = j; return get_helper(2, index_helper); } double& operator()(int i, int j, int k) { index_helper[0] = i; index_helper[1] = j; index_helper[2] = k; return get_helper(3, index_helper); } XArray operator*(double m) { XArray *xa = new XArray(num_dim, dims); for (int i = 0; i < table_size; i++) { xa->table[i] = this->table[i] * m; } return *xa; } XArray operator+(const XArray &that) { if (num_dim != that.num_dim) { char *msg = new char[100]; sprintf(msg, "XArray::dimensions do not match in + operation, expected %d, found %d", num_dim, that.num_dim); throw msg; } for (int i = 0; i < num_dim; i++) { if (this->dims[i] != that.dims[i]) { char *msg = new char[100]; sprintf(msg, "XArray::dimension %d not mached, %d != %d", i, dims[i], that.dims[i]); throw msg; } } XArray *xa = new XArray(num_dim, dims); for (int i = 0; i < table_size; i++) { xa->table[i] = this->table[i] + that.table[i]; } return *xa; } private: double& get_helper(int n, int *indices) { if (n != num_dim) { char *msg = new char[100]; sprintf(msg, "XArray::dimensions do not match, expected %d, found %d", num_dim, n); throw msg; } int multiplier = 1; int index = 0; for (int i = 0; i < n; i++) { if (indices[i] < 0 || indices[i] >= dims[i]) { char *msg = new char[100]; sprintf(msg, "XArray::index %d out of range, %d not in (0, %d)", i, indices[i], dims[i]); throw msg; } index += indices[i] * multiplier; multiplier *= dims[i]; } return table[index]; }
};
事實證明,數組的維數真的屬於類型系統本身。幸運的是,C++有模板。您可以使'XArray <1>'爲一維陣列,'XArray <2>'二維等。 – MSalters
如何使用現有的[多維數組類](http://www.boost.org/doc/libs/1_46_1/libs/multi_array/doc/index.html)? –
@Kerrek SB - Boost.Multi_array不支持Mohsen似乎期望的元素添加和標量乘法操作。儘管如此,它可能對底層實現很有用。 – Mankarse