用C ++实现动态矩阵的功能

时间:2017-03-12 12:46:22

标签: c++ arrays function memory

伙计们,我想通过使用函数来实现动态二维数组(当我将解决不同的任务时,更容易创建数组)。 我使用下一种内存分配方式:

  1. 创建一个大的MxN阵列。
  2. 创建一个包含M个指针元素的数组。
  3. 代码:

    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
    

2 个答案:

答案 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