动态矩阵实现了C 的功能

Dynamic matrix realization with functions in C++

本文关键字:功能 实现 动态      更新时间:2023-10-16

大家,我想通过使用函数来实现动态二维数组(为了更轻松地创建数组,当我解决不同的任务时)。我使用下一个内存分配方式:

  1. 创建一个大MXN数组。
  2. 创建一个带有指针元素的数组。

代码:

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