Memory leak even after deleting memory pointers from vector

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • cham

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

  • Sumanth

    #2
    Re: Memory leak even after deleting memory pointers from vector

    On Sep 23, 11:31 am, cham <deepunjoy2...@ gmail.comwrote:
    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();
    >
    }
    >
    Hi,

    It is not guaranteed that the memory usage will "show" decrease in
    memory if you delete any objects. And its not a memory leak.

    When you delete objects, the memory management module of the OS does
    not immediately reclaimed that much memory. Optimization is done by
    retaining the "freed" memory within the process and when you request
    for additional memory using "new", this memory pool is used to return
    memory.

    Similarly during allocation,you might request 500 bytes of memory, but
    the memory allocation from the OS will be in multiples of an OS
    dependant memory chunk. The memory increase/decrease of a process will
    not follow the exact sequence of new/delete calls.

    In your example, after the deletion, try allocating memory again for
    the same set of objects. There should not be any increase in memory as
    the deleted memory should be reused.

    Rgds

    Comment

    • Sumanth

      #3
      Re: Memory leak even after deleting memory pointers from vector

      On Sep 23, 11:55 am, Sumanth <gsuma...@gmail .comwrote:
      Code:
      >[QUOTE]
       #define ALTERNATE
      On Sep 23, 11:31 am, cham <deepunjoy2...@ gmail.comwrote: > > >
      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 -
      >
      >[QUOTE] #define MAX_STRING_VEC_SIZE 134 #define MAX_STRUCT_VEC_SIZE 1024*200//134 #define MAX_MEM_SIZE 1024*50[/QUOTE] >[QUOTE] /*vector of char * type*/ void Function() {         std::vector< char * v_pData;[/QUOTE] >[QUOTE] #ifdef ALTERNATE         v_pData.resize( MAX_STRING_VEC_SIZE, NULL ); #endif //ALTERNATE[/QUOTE] >[QUOTE]         bool bFlag = true;         while( bFlag );[/QUOTE] >[QUOTE]         //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 );[/QUOTE] >[QUOTE] #ifdef ALTERNATE                 v_pData[nInd] = pData; #else  //ALTERNATE                 v_pData.push_back( pData ); #endif //#endif //ALTERNATE[/QUOTE] >[QUOTE]         }[/QUOTE] >[QUOTE]         bFlag = true;         while( bFlag );[/QUOTE] >[QUOTE]         //Release all the Memory         for( int nInd = 0 ; nInd < MAX_STRING_VEC_SIZE; nInd++ )         {                 delete [] v_pData[nInd];         }[/QUOTE] >[QUOTE]         v_pData.clear();[/QUOTE] >[QUOTE] }[/QUOTE] >[QUOTE] /*vector of SAMPLE_TABLE_STRUCT * type*/ void Function1() {         std::vector< SAMPLE_TABLE_STRUCT * v_pData;[/QUOTE] >[QUOTE] #ifdef ALTERNATE         v_pData.resize( MAX_STRUCT_VEC_SIZE, NULL ); #endif //ALTERNATE[/QUOTE] >[QUOTE]         //Allocate Memory         for( int nInd = 0 ; nInd < MAX_STRUCT_VEC_SIZE; nInd++ )         {                 SAMPLE_TABLE_STRUCT * pData = new SAMPLE_TABLE_STRUCT;[/QUOTE] >[QUOTE] #ifdef ALTERNATE                 v_pData[nInd] = pData; #else  //ALTERNATE                 v_pData.push_back( pData ); #endif //#endif //ALTERNATE[/QUOTE] >[QUOTE]         }[/QUOTE] >[QUOTE]         //Release all the Memory         for( int nInd = 0 ; nInd < MAX_STRUCT_VEC_SIZE; nInd++ )         {                 delete v_pData[nInd];                 v_pData[nInd] = NULL;         }[/QUOTE] >[QUOTE]         v_pData.clear();[/QUOTE] >[QUOTE] }[/QUOTE] >[QUOTE] [/QUOTE]
      >
      Hi,
      >
      It is not guaranteed that the memory usage will "show" decrease in
      memory if you delete any objects. And its not a memory leak.
      >
      When you delete objects, the memory management module of the OS does
      not immediately reclaimed that much memory. Optimization is done by
      retaining the "freed" memory within the process and when you request
      for additional memory using "new", this memory pool is used to return
      memory.
      >
      Similarly during allocation,you might request 500 bytes of memory, but
      the memory allocation from the OS will be in multiples of an OS
      dependant memory chunk. The memory increase/decrease of a process will
      not follow the exact sequence of new/delete calls.
      >
      In your example, after the deletion, try allocating memory again for
      the same set of objects. There should not be any increase in memory as
      the deleted memory should be reused.
      >
      Rgds[/QUOTE]

      Just to add, there are low level memory allocation routines such as
      sbrk, that control the size of a program's data space.

      Comment

      • cham

        #4
        Re: Memory leak even after deleting memory pointers from vector

        On Sep 23, 3:55 pm, Sumanth <gsuma...@gmail .comwrote:
        Code:
        >[QUOTE]
         #define ALTERNATE
        On Sep 23, 11:31 am, cham <deepunjoy2...@ gmail.comwrote: > > >
        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 -
        >
        >[QUOTE] #define MAX_STRING_VEC_SIZE 134 #define MAX_STRUCT_VEC_SIZE 1024*200//134 #define MAX_MEM_SIZE 1024*50[/QUOTE] >[QUOTE] /*vector of char * type*/ void Function() { std::vector< char * v_pData;[/QUOTE] >[QUOTE] #ifdef ALTERNATE v_pData.resize( MAX_STRING_VEC_SIZE, NULL ); #endif //ALTERNATE[/QUOTE] >[QUOTE] bool bFlag = true; while( bFlag );[/QUOTE] >[QUOTE] //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 );[/QUOTE] >[QUOTE] #ifdef ALTERNATE v_pData[nInd] = pData; #else //ALTERNATE v_pData.push_back( pData ); #endif //#endif //ALTERNATE[/QUOTE] >[QUOTE] }[/QUOTE] >[QUOTE] bFlag = true; while( bFlag );[/QUOTE] >[QUOTE] //Release all the Memory for( int nInd = 0 ; nInd < MAX_STRING_VEC_SIZE; nInd++ ) { delete [] v_pData[nInd]; }[/QUOTE] >[QUOTE] v_pData.clear();[/QUOTE] >[QUOTE] }[/QUOTE] >[QUOTE] /*vector of SAMPLE_TABLE_STRUCT * type*/ void Function1() { std::vector< SAMPLE_TABLE_STRUCT * v_pData;[/QUOTE] >[QUOTE] #ifdef ALTERNATE v_pData.resize( MAX_STRUCT_VEC_SIZE, NULL ); #endif //ALTERNATE[/QUOTE] >[QUOTE] //Allocate Memory for( int nInd = 0 ; nInd < MAX_STRUCT_VEC_SIZE; nInd++ ) { SAMPLE_TABLE_STRUCT * pData = new SAMPLE_TABLE_STRUCT;[/QUOTE] >[QUOTE] #ifdef ALTERNATE v_pData[nInd] = pData; #else //ALTERNATE v_pData.push_back( pData ); #endif //#endif //ALTERNATE[/QUOTE] >[QUOTE] }[/QUOTE] >[QUOTE] //Release all the Memory for( int nInd = 0 ; nInd < MAX_STRUCT_VEC_SIZE; nInd++ ) { delete v_pData[nInd]; v_pData[nInd] = NULL; }[/QUOTE] >[QUOTE] v_pData.clear();[/QUOTE] >[QUOTE] }[/QUOTE] >[QUOTE] [/QUOTE]
        >
        Hi,
        >
        It is not guaranteed that the memory usage will "show" decrease in
        memory if you delete any objects. And its not a memory leak.
        >
        When you delete objects, the memory management module of the OS does
        not immediately reclaimed that much memory. Optimization is done by
        retaining the "freed" memory within the process and when you request
        for additional memory using "new", this memory pool is used to return
        memory.
        >
        Similarly during allocation,you might request 500 bytes of memory, but
        the memory allocation from the OS will be in multiples of an OS
        dependant memory chunk. The memory increase/decrease of a process will
        not follow the exact sequence of new/delete calls.
        >
        In your example, after the deletion, try allocating memory again for
        the same set of objects. There should not be any increase in memory as
        the deleted memory should be reused.
        >
        Rgds[/QUOTE]

        Sumanth,

        Thank you for your valuable reply...

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

        Deepak

        Comment

        • rogo

          #5
          Re: Memory leak even after deleting memory pointers from vector

          But we observed reduction in memory when we use vector of type "char
          *" and not in case of user defined structure "SAMPLE_TABLE_S TRUCT".
          Why there is a difference in the two cases...?
          Use valgrind to test for memory leaks.

          Rogo

          Comment

          • cham

            #6
            Re: Memory leak even after deleting memory pointers from vector

            On Sep 24, 5:07 pm, rogo <d.rogow...@vel ian.dewrote:
            But we observed reduction inmemorywhen we use vector of type "char
            *" and not in case of user defined structure "SAMPLE_TABLE_S TRUCT".
            Why there is a difference in the two cases...?
            >
            Use valgrind to test formemoryleaks.
            >
            Rogo
            Hi Rogo,

            We checked with valgrind tool but it tells there are no memory
            leaks.....

            Thanks
            Cham ( Deepak )

            Comment

            Working...