2009-04-08 5 views
1

Hyすべて、メモリ割り当てのための専用関数がメモリリークを引き起こしますか?

私は次のコードがメモリリークを生成していると思いますか?

/* External function to dynamically allocate a vector */ 
    template <class T> 
      T *dvector(int n){ 
      T *v; 

      v = (T *)malloc(n*sizeof(T)); 

      return v; 
    } 


    /* Function that calls DVECTOR and, after computation, frees it */ 
    void DiscontinuousGalerkin_Domain::computeFaceInviscidFluxes(){ 
      int e,f,n,p; 
      double *Left_Conserved; 

      Left_Conserved = dvector<double>(NumberOfProperties); 

      //do stuff with Left_Conserved 
      // 

      free(Left_Conserved); 

      return; 
    } 

私は(Left_Conserved)自由が正常に割り当て解除なるようにDVECTORへのポインタを渡すことによって、それは、それを割り当て、正しいアドレスを返すでしょう、と思いました。しかし、そうではないようです。

注:私も新しいでテストしてきた/削除成功せず無料のmalloc /どちらか交換します。

2次元配列を割り当てるための同様のコードがあります。私はそれらをたくさん使っているので、そのようなベクトル/配列を管理することに決めました。また、C++でより深いメモリ管理を理解したいと思っています。

私はベクトルと配列を割り当てるための外部関数を保つことができます。メモリリークを避けるためにここにキャッチは何ですか?

EDIT

私はコンストラクタが呼び出されていないので、それは、私が推測する、潜在的な問題であるので、私は、同様にユーザー定義型を割り当てるためにDVECTOR機能を使用してきました。

Left_Conservedベクトルを解放する前のコードでも、別の方法でベクトルを割り当てたいと思っていましたが、他の関数でそのポインタを使って評価するために "オープン"にしておきました。 BOOSTを使用すると、関数の終了時に自動的に割り当てが消去されるため、BOOSTを使用した「パブリック」配列は得られません。私はそれがNEWで簡単に修正されると思いますが、マトリックスにとってより良い方法は何でしょうか?

私は、ポインタを他の関数の引数として渡したばかりです。さて、BOOSTはあまり楽しんでいないようで、コンパイルはエラーで終了します。

私は、他の関数への引数として渡されるユーザー定義の型を受け入れるベクトルまたは行列へのポインタが必要であることに変わりはありません。ベクトル(または行列)は、おそらく外部関数に割り当てられ、別の適切な関数で解放されます。 (私は、コードでどこでも行列を割り当てるためのループと新しいものをコピーすることが好きではないでしょう!)

ここ

は私がやりたいものです:

template <class T> 
    T **dmatrix(int m, int n){ 
      T **A; 

      A = (T **)malloc(m*sizeof(T *)); 
      A[0] = (T *)malloc(m*n*sizeof(T)); 

      for(int i=1;i<m;i++){ 
        A[i] = A[i-1]+n; 
      } 

      return A; 
    } 


    void Element::setElement(int Ptot, int Qtot){ 

      double **MassMatrix; 

      MassMatrix = dmatrix<myT>(Ptot,Qtot); 

      FillInTheMatrix(MassMatrix); 

      return; 
    } 

答えて

関連する問題