yotamoo
yotamoo

Reputation: 5452

unclear memory leak with vector, c++, when calling exit

I was debugging my program and I've noticed that even though I've marked almost all of it as comment and all I did was to push double values into a vector, I have a memory leak. I read the api in c++ reference, but couldn't find anything. Here's the code:

#include <vector>
#include <cstdlib>
#include <iostream>
#include "RegMatrix.h"
#include "Matrix.h"

using namespace std;

int main(void)
{
    vector<double> v;
    for (int i=0; i<9; i++)
    {
        v.push_back(i);
    }
    cout << endl;

    exit(EXIT_SUCCESS);
}

And valgrind's report:

==9299== HEAP SUMMARY:
==9299==     in use at exit: 128 bytes in 1 blocks
==9299==   total heap usage: 5 allocs, 4 frees, 248 bytes allocated
==9299== 
==9299== 128 bytes in 1 blocks are still reachable in loss record 1 of 1
==9299==    at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==9299==    by 0x804937D: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void     const*) (in /home/yotamoo/workspace/ex3/main)
==9299==    by 0x804922F: std::_Vector_base<double, std::allocator<double>     >::_M_allocate(unsigned int) (in /home/yotamoo/workspace/ex3/main)
==9299==    by 0x8048E6C: std::vector<double, std::allocator<double>     >::_M_insert_aux(__gnu_cxx::__normal_iterator<double*, std::vector<double,     std::allocator<double> > >, double const&) (in /home/yotamoo/workspace/ex3/main)
==9299==    by 0x8048CA2: std::vector<double, std::allocator<double> >::push_back(double     const&) (in /home/yotamoo/workspace/ex3/main)
==9299==    by 0x8048B10: main (in /home/yotamoo/workspace/ex3/main)
==9299== 
==9299== LEAK SUMMARY:
==9299==    definitely lost: 0 bytes in 0 blocks
==9299==    indirectly lost: 0 bytes in 0 blocks
==9299==      possibly lost: 0 bytes in 0 blocks
==9299==    still reachable: 128 bytes in 1 blocks
==9299==         suppressed: 0 bytes in 0 blocks

This is weird. Any ideas? thanks

Upvotes: 9

Views: 1946

Answers (5)

Vishal Jaiswal
Vishal Jaiswal

Reputation: 54

You did not have to call the exit function it will immediate exit from the program did not call the OS clean up calls.

Always use the return() not exit().

Upvotes: 0

Soren
Soren

Reputation: 14688

The vector never goes out of scope for the exit.

Just remove the exit() from main and replace it with a return 0;

Upvotes: 7

John Gordon
John Gordon

Reputation: 2704

I don't believe that you have a memory leak. When valgrind says the memory is still reachable it's not telling you that it leaked but that it wasn't free'ed before the program exited. In this case the vector desctructor didn't get called before exit. Try returning from main rather than calling exit().

Upvotes: 2

Vlad
Vlad

Reputation: 35594

Did you try putting all the code except exit in a separate {} block?

Upvotes: 1

orlp
orlp

Reputation: 117691

exit() will not call the destructors of the current scope thus there may be a leak:

(§3.6.1/4) Calling the function void exit(int); declared in <cstdlib> (18.3) terminates the program without leaving the current block and hence without destroying any objects with automatic storage duration (12.4). If exit is called to end a program during the destruction of an object with static storage duration, the program has undefined behavior.

Use this instead:

#include <vector>
#include <iostream>

int main(int argc, char *argv[]) {
    std::vector<double> v;

    for (int i=0; i<9; i++) {
        v.push_back(i);
    }

    std::cout << endl;
    return 0;
}

Upvotes: 18

Related Questions