непонятная утечка памяти с вектором, c ++, при вызове exit - PullRequest
8 голосов
/ 10 сентября 2011

Я отлаживал свою программу и заметил, что, хотя я пометил почти все это как комментарий, и все, что я сделал, это вставил двойные значения в вектор, у меня есть утечка памяти.Я прочитал API в C ++, но ничего не смог найти.Вот код:

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

И отчет Вальгринда:

==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

Это странно.Есть идеи?спасибо

Ответы [ 5 ]

18 голосов
/ 10 сентября 2011

exit() не вызовет деструкторы текущей области видимости, поэтому возможна утечка:

(§3.6.1 / 4) Вызов функции void exit(int);, объявленной в <cstdlib> (18.3), завершает программу, не покидая текущий блок и, следовательно, не уничтожая объекты с длительностью автоматического хранения (12.4). Если exit вызывается для завершения программы во время уничтожения объекта со статической продолжительностью хранения, программа имеет неопределенное поведение.

Используйте это вместо:

#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;
}
7 голосов
/ 10 сентября 2011

Вектор никогда не выходит за рамки выхода.

Просто удалите exit() из основного и замените его на return 0;

2 голосов
/ 10 сентября 2011

Я не верю, что у вас утечка памяти.Когда Вальгринд говорит, что память все еще доступна, он не говорит, что утечка произошла, но что она не была освобождена до выхода из программы.В этом случае векторный дескриптор не вызывался до выхода.Попробуйте вернуться из main, а не вызывать exit ().

1 голос
/ 10 сентября 2011

Вы пытались поместить весь код, кроме exit, в отдельный блок {}?

0 голосов
/ 16 января 2012

Вам не нужно было вызывать функцию выхода, она будет немедленно выходить из программы, не вызывать вызовы очистки ОС.

Всегда используйте return (), а не exit ().

...