删除二维数组使用内存?

时间:2013-03-29 00:16:04

标签: c++ pointers vector multidimensional-array

我一直在研究这个程序。这只是提取的两个导致内存泄漏的函数,我似乎无法调试。任何帮助都会很棒!

   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();
   }

2 个答案:

答案 0 :(得分:1)

我盯着代码看了一段时间,我似乎无法找到任何泄漏。在我看来,每个delete只有一个new,应该是这样。

尽管如此,我真的想说声明std::vector<int**>几乎无视使用std::vector本身。

在C ++中,当你必须使用指针时,很少有这种情况,而这不是其中之一。 我承认声明并使用std::vector<std::vector<std::vector<int>>>会很痛苦,但这会确保您的代码中没有泄漏。

因此,我建议您根据自动管理内存分配的对象重新考虑您的实现。

答案 1 :(得分:0)

第1点:如果您有内存泄漏,请使用valgrind找到它。就像蓝色一样,我似乎无法在您的代码中发现内存泄漏,但valgrind会告诉您确定您的内存是什么。

第2点:您正在有效地创建一个2x100x100 3D阵列。 C ++不是这种东西的正确语言。当然,您可以使用具有明显缺点的std::vector<std::vector<std::vector<int>>>。或者你可以回到C:

int depth = 2, width = 100, height = 100;

//Allocation:
int (*threeDArray)[height][width] = malloc(depth*sizeof(*threeDArray));

//Use of the last element in the 3D array:
threeDArray[depth-1][height-1][width-1] = 42;

//Deallocation:
free(threeDArray);

请注意,这是有效的C,但不是有效的C ++:后一种语言不允许运行时大小为数组类型,而前者支持自C99以来。在这方面,C比C ++更强大。