这是一个简单的程序,我尝试用向量来理解内存分配/自由行为。结构具有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
感谢您的指导。感谢。
答案 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()