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,每个 都有一个new,因为它应该是。

尽管如此,我真的想说,声明一个std::vector<int**>几乎违背了使用std::vector它本身的意义。

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

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

于 2013-03-29T00:28:26.010 回答
0

Point 1:如果你有内存泄漏,用valgrind它来定位它。就像蓝色一样,我似乎无法在您的代码中找到内存泄漏,但valgrind会肯定地告诉您您的内存出了什么问题。

第 2 点:您正在有效地创建一个 2x100x100 3D 数组。C++ 不是这种事情的正确语言。当然,您可以使用std::vector<std::vector<std::vector<int>>>具有明显缺点的 an。或者您可以退回到 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++ 更强大。

于 2015-07-03T22:59:06.520 回答