vector clear()似乎没有释放push_back中分配的内存

时间:2015-03-19 07:47:26

标签: c++ memory-management vector

这是一个简单的程序,我尝试用向量来理解内存分配/自由行为。结构具有vector<int>作为其成员。我的理解是对向量clear()的调用将导致向量元素的内存不存在。但是valgrind标记了内存泄漏。

代码看起来很简单但是花了很长时间才来到这里。

#include <iostream>
#include <vector>

using namespace std;

struct a {
    vector<int> v;
};

int main (void) {

    struct a *aptr = (struct a*) calloc(1, sizeof(struct a));

    aptr->v.push_back(10);

    aptr->v.clear();

    free(aptr);

    return 0;
}
==27649== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==27649==    at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27649==    by 0x4013A7: __gnu_cxx::new_allocator<int>::allocate(unsigned long, void const*) (new_allocator.h:92)
==27649==    by 0x4011BE: std::_Vector_base<int, std::allocator<int> >::_M_allocate(unsigned long) (in /homes/dineshb/code_tryout/c++/vectors/a.out)
==27649==    by 0x400DC8: void std::vector<int, std::allocator<int> >::_M_insert_aux<int>(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int&&) (vector.tcc:327)
==27649==    by 0x400BE3: void std::vector<int, std::allocator<int> >::emplace_back<int>(int&&) (vector.tcc:102)
==27649==    by 0x400B1D: std::vector<int, std::allocator<int> >::push_back(int&&) (stl_vector.h:840)
==27649==    by 0x400A68: main (vector.cpp:14)
==27649== 
==27649== LEAK SUMMARY:
==27649==    definitely lost: 4 bytes in 1 blocks
==27649==    indirectly lost: 0 bytes in 0 blocks
==27649==      possibly lost: 0 bytes in 0 blocks
==27649==    still reachable: 0 bytes in 0 blocks
==27649==         suppressed: 0 bytes in 0 blocks

感谢您的指导。感谢。

1 个答案:

答案 0 :(得分:6)

您无法使用calloc来实例化std::vector。这只保留内存,但std::vector需要在某个时候调用它的构造函数。同样,您无法使用free销毁矢量。需要调用它的析构函数。

您可以像这样修复代码:

int main () 
{
    a a_not_ptr;
    a_not_ptr.v.push_back(10);
}

这样,调用构造函数和析构函数。 std::vector的析构函数负责清理其资源,因此无需调用a_not_ptr.v.clear()