Memory leak even after deleting memory pointers from vector

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • deepak1905
    New Member
    • Sep 2008
    • 2

    #1

    Memory leak even after deleting memory pointers from vector

    Hi,

    I am working on c++ in a linux system ( Fedora core 4 ),
    kernel version - 2.6.11-1.1369_FC4
    gcc version - 4.0.0 20050519 ( Red Hat 4.0.0-8 )

    In my code i am creating a vector to store pointers of type structure "SAMPLE_TABLE_S TRUCT" ( size of this structure is 36 bytes ). I create an instance of structure "SAMPLE_TABLE_S TRUCT" using operator "new" and push back into the vector,this is done inside a for loop for 204800 times. After i come out of for loop i observe the memory consumed by the process using the command "pmap -d pid". The memory consumption increases by approximately 8 MB. After this i delete all the contents of vector using "delete" operator. Now if i observe the memory consumed by the process ( using "pmap -d pid" command ) it shows no reduction in the memory even after deallocating the memory in the code.

    It shows memory reduction after deleting vector contents if i store the "char *" elements into the vector instead of "SAMPLE_TABLE_S TRUCT *" elements.

    Am not able to figure it out why even after deleting the vector ( of type "SAMPLE_TABLE_S TRUCT *" )contents the memory reduction is not seen...?

    Can anyone please help me out here...?

    Here is the piece of code where am facing the problem -

    Code:
    #define ALTERNATE
    
    #define MAX_STRING_VEC_SIZE 134
    #define MAX_STRUCT_VEC_SIZE 1024*200//134
    #define MAX_MEM_SIZE 1024*50
    
    
    /*vector of char * type*/
    void Function()
    {
    	std::vector< char * > v_pData;
    
    #ifdef ALTERNATE
    	v_pData.resize( MAX_STRING_VEC_SIZE, NULL );
    #endif //ALTERNATE
    
    	bool bFlag = true;
    	while( bFlag );
    
    	//Allocate Memory	
    	for( int nInd = 0 ; nInd < MAX_STRING_VEC_SIZE; nInd++ )
    	{
    		char * pData = new char [MAX_MEM_SIZE];
    		memset( pData, 0, MAX_MEM_SIZE );
    
    #ifdef ALTERNATE
    		v_pData[nInd] = pData;
    #else  //ALTERNATE
    		v_pData.push_back( pData );
    #endif //#endif //ALTERNATE
    
    	}
    
    	bFlag = true;
    	while( bFlag );
    
    	//Release all the Memory
    	for( int nInd = 0 ; nInd < MAX_STRING_VEC_SIZE; nInd++ )
    	{
    		delete [] v_pData[nInd];
    	}
    
    	v_pData.clear();
    }
    
    /*vector of SAMPLE_TABLE_STRUCT * type*/
    void Function1()
    {
    	std::vector< SAMPLE_TABLE_STRUCT * > v_pData;
    
    #ifdef ALTERNATE
    	v_pData.resize( MAX_STRUCT_VEC_SIZE, NULL );
    #endif //ALTERNATE
    
    	//Allocate Memory	
    	for( int nInd = 0 ; nInd < MAX_STRUCT_VEC_SIZE; nInd++ )
    	{
    		SAMPLE_TABLE_STRUCT * pData = new SAMPLE_TABLE_STRUCT;
    
    #ifdef ALTERNATE
    		v_pData[nInd] = pData;
    #else  //ALTERNATE
    		v_pData.push_back( pData );
    #endif //#endif //ALTERNATE
    
    	}
    
    	//Release all the Memory
    	for( int nInd = 0 ; nInd < MAX_STRUCT_VEC_SIZE; nInd++ )
    	{
    		delete v_pData[nInd];
    		v_pData[nInd] = NULL;
    	}
    
    	v_pData.clear();
    }
  • weaknessforcats
    Recognized Expert Expert
    • Mar 2007
    • 9214

    #2
    The vector is a vector of char* and from your post you added 204800 char* to the vector. After you delete the char* from the vector I would not expect the vector to get smaller. That's because vector is optimized for speed and once it has got to a size it wants to stay there.

    You shrink your vector by swapping it with an empy one.

    Comment

    • JosAH
      Recognized Expert MVP
      • Mar 2007
      • 11453

      #3
      Originally posted by weaknessforcats
      You shrink your vector by swapping it with an empy one.
      And even then the memory previously allocated to the vector will not be returned
      to the OS but stays part of the 'heap' owned by the process.

      kind regards,

      Jos

      Comment

      • deepak1905
        New Member
        • Sep 2008
        • 2

        #4
        Originally posted by JosAH
        And even then the memory previously allocated to the vector will not be returned
        to the OS but stays part of the 'heap' owned by the process.

        kind regards,

        Jos

        Thank you for your valuable reply...

        But we observed reduction in memory (after deletion of entries from vector) when we use vector of type "char *" (in Function()) and not in case of user defined structure "SAMPLE_TABLE_S TRUCT" (in Function1()).
        Why there is a difference in the two cases...?

        Deepak

        Comment

        Working...