c++ - 配列をC++の関数に渡す

原文 c++ arrays function memory-management

C++で特定の関数に配列を渡したいのですが。次のコードを書きました。

#define nmpart 50

void distances( double (&dis)[3][nmpart][nmpart] )
{
    ... compute distances which are allocated in "dis"
}

double energy()
{
        double dis[3][nmpart][nmpart];

        distances(dis);
}


このコードは、nmpart <800程度で問題なく機能します。問題は私が望むことです
より大きな配列を作成するには、nmpart = 50000とします。私はこのフォーラムでそれを読んだ
動的割り当てを使用して、この問題を克服できます。どうすればいいのかはっきりしない
この状況では、動的割り当てを使用します。ヒントをください。
答え
さて、多くの人々(私を含む)は、このコードを専門的に(またはその他の方法で)作成することはありませんが、基本的にはあなたの質問に答えます。私がこれを専門的に書こうとしない理由については、以下を参照してください。

#define nmpart 50  

void distances( const double ***dist) 
{     
    ... compute distances which are allocated in "dis" 
}  

double energy()
{ 
     double ***dis;

     // allocate dis
     dis = new double**[3];
     for(int i=0;i<3;++i)
     {
         dis[i] = new double*[nmpart];
         for(int j=0;j<nmpart;++j)
         {
              dis[i][j] = new double[nmpart];
         }
     }

     // code where you populate dis
     // HERE

     distances(dis);

     // deallocate dis
     for(int i=0;i<3;++i)
     {
         for(int j=0;j<nmpart;++j)
         {
              delete [] dis[i][j];
         }
         delete [] dis[i];
     }
     delete [] dis;

} 


基本的に、私は(説明目的以外で)これを記述することはありません。この関数のどこかで例外がスローされると、メモリがリークするためです。最善の方法は、ヒープ割り当てと割り当て解除(それぞれnewdeleteを使用)をクラスでラップし、そのクラスをenergy()関数内のローカルスタックに配置することです。

理想的には次のようなことをするでしょう:

#define nmpart 50    

void distances( const distClass &dis)  
{          
   ... compute distances which are allocated in "dis"  
}

double energy() 
{  
    distClass dis;
    // this allocate wraps the for loops with the new []'s above
    dis.Allocate(3, nmpart , nmpart);  

    // populate dis HERE

    distances(dis);

    // when dis goes out of scope its destructor
    // is called, which wraps the for loops with the delete []'s
}
関連記事

c++ - 述語ファンクタのパッケージ化

c++ - 空のBoostアキュムレータを使用する

c++ - VC++リソースコンパイラ(RC)オプション/ n…?

c++ - GL_DRAW_FRAMEBUFFERターゲットを使用すると、glBindFramebufferが「無効な操作」GLエラーを引き起こす

c++ - クラスのメンバーアクセス

c++ - ImageMagick C++ API出力16ビットグレースケールpng?

c++ - TWAINでサポートされている解像度を列挙するにはどうすればよいですか

c++ - C++入力が正しいかどうかをユーザーに尋ねるエラー

c# - 分類ライブラリ

c++ - 警告—ポインターと組み合わせた算術式の不審な切り捨て