伙计们,我想通过使用函数来实现动态二维数组(当我将解决不同的任务时,更容易创建数组)。 我使用下一种内存分配方式:
代码:
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
答案 0 :(得分:0)
您缺少一定程度的封装 - 创建矩阵类并且无法管理内存和指针。作为一个积极的副作用,您将能够为新数据类型定义自定义运算符并提高代码的可读性。
答案 1 :(得分:0)
我找到了另一种方法,因为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