Debugowałem mój program i zauważyłem, że mimo, że oznaczyłem prawie wszystkie z to jako komentarz i wszystko, co zrobiłem, to wcisnąć podwójne wartości do wektora Mam wyciek pamięci. Czytałem api w C++, ale nie mogłem nic znaleźć. Oto kod:nieczytelny przeciek pamięci z wektorem, C++, podczas wywoływania wyjścia
#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);
}
I raport valgrind za:
==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
To jest dziwne. Jakieś pomysły? Dzięki
Jest to spowodowane funkcją exit(). Jest to stary kod C i nie może poprawnie obsługiwać destruktorów C++. – tp1
Czy to możliwe, że v jest niszczony po wywołaniu wyjścia? Co zrobić, jeśli umieścisz znak v w swoim zasięgu (na przykład w nawiasach)? – nulvinge
@yotamoo: Nawet nie musisz tego robić. Po osiągnięciu końca 'main' jest to samo, co zwracanie zera z głównego. (Jest to jedyna funkcja zadeklarowana jako zwracająca "int", która faktycznie nie musi zwracać czegoś) –