2

私はかなり長い間このプログラムに取り組んできました。これは、デバッグできないように見えるメモリ リークを引き起こしている、抽出された 2 つの関数にすぎません。どんな助けでも素晴らしいでしょう!

   vector<int**> garbage;

使用済みメモリを削除するコード

   void clearMemory()
   {
         for(int i = 0; i < garbage.size(); i++)
         {
               int ** dynamicArray = garbage[i];

               for( int j = 0 ; j < 100 ; j++ )
               {
                   delete [] dynamicArray[j];
               }
         delete [] dynamicArray;
         }
         garbage.clear();
   }

動的配列を宣言するコード

   void main()
   {
        int ** dynamicArray1 = 0;
        int ** dynamicArray2 = 0;


        dynamicArray1 = new int *[100] ;
        dynamicArray2 = new int *[100] ;

        for( int i = 0 ; i < 100 ; i++ )
        {
            dynamicArray1[i] = new int[100];
            dynamicArray2[i] = new int[100];
        }

        for( int i = 0; i < 100; i++)
        {
            for(int j = 0; j < 100; j++)
            {
                dynamicArray1[i][j] = random();
            }
        }

        //BEGIN MULTIPLICATION WITH SELF AND ASSIGN TO SECOND ARRAY
        dynamicArray2 = multi(dynamicArray1); //matrix multiplication
        //END MULTIPLICATION AND ASSIGNMENT

        garbage.push_back(dynamicArray1);
        garbage.push_back(dynamicArray2);
        clearMemory();
   }
4

2 に答える 2

1

しばらくコードを見つめましたが、リークが見つからないようです。本来あるべきように、deleteごとに正確に1つあるように見えます。new

とはいえ、 を宣言することは、それ自体std::vector<int**>を使用するという点に反することだと本当に言いたかったのです。std::vector

C++ では、ポインターを使用しなければならないケースはほとんどなく、これはその 1 つではありません。を宣言して使用するのstd::vector<std::vector<std::vector<int>>>は面倒ですが、コードにリークがないことを確認できます。

したがって、メモリ割り当てを自動的に管理するオブジェクトの観点から、実装を再考することをお勧めします。

于 2013-03-29T00:28:26.010 に答える