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

xme*_*men -2 c++ memory-management vector

这是一个简单的程序,我尝试用向量来理解内存分配/自由行为.struct有一个vector<int>as成员.我的理解是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;
}
Run Code Online (Sandbox Code Playgroud)
==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
Run Code Online (Sandbox Code Playgroud)

感谢您的指导.谢谢.

jua*_*nza 6

你不能calloc用来实例化一个std::vector.这只保留内存,但std::vector需要在某个时候调用它的构造函数.同样,你不能用它破坏一个向量free.它的析构函数需要被调用.

您可以像这样修复代码:

int main () 
{
    a a_not_ptr;
    a_not_ptr.v.push_back(10);
}
Run Code Online (Sandbox Code Playgroud)

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