大家,我想通过使用函数来实现动态二维数组(为了更轻松地创建数组,当我解决不同的任务时)。我使用下一个内存分配方式:
- 创建一个大MXN数组。
- 创建一个带有指针元素的数组。
代码:
int main()
{
int *A1;
int **A;
A1 = new T [M*N];
A = new T* [M];
for(int i=0;i<M;i++)
{
A[i]=(A1+(i*M));
}
delete []A;
delete []A1;
}
但是,当我想将创建和删除到h文件中的实现移动时(因为我使用模板来创建不同类型的数组的模板)时,我有一个问题:如何知道A1数组的地址(包含所有值的MXN数组)矩阵),以防止内存泄漏。如果我没有误认为C 中的函数()只能返回1个值(**一个指针,但是*A1指针会忘记,所以将来我可以删除数组A1的内存)。
#ifndef MATRIX_H
#define MATRIX_H
namespace matrix
{
template <typename T> T** create_matrix(int N, int M)
{
int *A1;
int **A;
A1 = new T [M*N];
A = new T* [M];
for(int i=0;i<M;i++)
{
A[i]=(A1+(i*M));
}
return A; //how to return also A1 for preventing memory leack
}
template <typename T> void delete_matrix(T* A1, T** A)
{
delete []A;
delete []A1;
}
}
#endif
您缺少一个封装级别 - 创建一个矩阵类,并同时管理内存和指针。作为积极的副作用,您将能够为新数据类型定义自定义操作员并提高代码的可读性。
我找到了另一种方法,因为a [0]收集了相同的内存地址,例如A1,理论上,当我们使用delete []A[0]
时,这与delete []A1
相似,或者没有?
#ifndef MATRIX_H
#define MATRIX_H
namespace matrix
{
template <typename T> T** create_matrix(int N, int M)
{
int *A1;
int **A;
A1 = new T [M*N];
A = new T* [M];
for(int i=0;i<M;i++)
{
A[i]=(A1+(i*M));
}
return A;
}
template <typename T> void delete_matrix(T** A)
{
delete []A;
delete []A[0]; //this is must be equivalent to delete []A1
}
}
#endif