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)
感谢您的指导.谢谢.
你不能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()