调用exit时,向量,c ++不清楚内存泄漏

时间:2011-09-10 16:12:29

标签: c++ memory memory-leaks valgrind

我正在调试我的程序,我注意到即使我已经标记了几乎全部 它作为评论,我所做的就是将双值推入向量,我有内存泄漏。我在c ++参考中读过api,但找不到任何东西。这是代码:

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

和valgrind的报告:

==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 个答案:

答案 0 :(得分:18)

exit()不会调用当前作用域的析构函数,因此可能存在泄漏:

  

(§3.6.1/ 4)调用void exit(int);(18.3)中声明的函数<cstdlib>终止程序而不离开当前块,因此不会破坏任何具有自动存储持续时间的对象(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;
}

答案 1 :(得分:7)

向量永远不会超出退出范围。

只需从main移除exit(),然后将其替换为return 0;

答案 2 :(得分:2)

我不相信你有内存泄漏。当valgrind说内存仍然可以访问时,它并没有告诉你它已经泄露但是在程序退出之前它没有被释放。在这种情况下,向量析构函数在退出之前没有被调用。尝试从main返回而不是调用exit()。

答案 3 :(得分:1)

您是否尝试将除exit之外的所有代码放在单独的{}块中?

答案 4 :(得分:0)

你没有必要调用exit函数,它会立即从程序中退出并没有调用OS清理调用。

始终使用return()而不是exit()。