Elysium
Elysium

Reputation: 75

Deleting two dimensional array use memory?

I have been working on this program for quite some time. This is just two of the functions extracted that are causing a memory leak that I cant seem to debug. Any help would be fantastic!

   vector<int**> garbage;

CODE for deleting the used memory

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

CODE for declaring dynamic array

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

Upvotes: 2

Views: 1841

Answers (2)

Point 1: If you have a memory leak, use valgrind to locate it. Just like blue, I can't seem to find a memory leak in your code, but valgrind will tell you for sure what's up with your memory.

Point 2: You are effectively creating a 2x100x100 3D array. C++ is not the right language for this kind of thing. Of course, you could use an std::vector<std::vector<std::vector<int>>> with the obvious drawbacks. Or you can drop back to 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);

Note that this is valid C, but not valid C++: The later language does not allow runtime sizes to array types, while the former supports that since C99. In this regard, C is more powerful than C++.

Upvotes: 0

blue
blue

Reputation: 2793

I stared at the code for some time and I can't seem to find any leak. It looks to me there's exactly one delete for every new, as it should be.

Nonetheless, I really wanted to say that declaring an std::vector<int**> pretty much defies the point of using std::vector itself.

In C++, there are very few cases when you HAVE to use pointers, and this is not one of them. I admit it would be a pain to declare and use an std::vector<std::vector<std::vector<int>>> but that would make sure there are no leaks in your code.

So I'd suggest you rethink your implementations in term of objects that automatically manage memory allocation.

Upvotes: 1

Related Questions