我有一些关于内存管理如何适用于Vectors的问题/示例。
vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;
在这种情况下,vec1的旧内存现在无法访问。它仍然是一个内存泄漏或vec2的旧内存意识到没有任何引用它并被清理?
在另一个例子中
struct foo
{
vector<int> foo_vec(50);
int* arr;
}
void myFunction()
{
vector<foo> vec(10);
vec[0].arr = new int[50];
vec.erase(vec.begin());
}
由于我在包含带有分配内存的arr的第一个向量元素上使用erase()
,erase()
是否释放该内存,还是需要在擦除之前手动释放它?此外,当vec
超出范围时,foo_vec
中的所有vec
向量都会自动清除吗?谢谢你的帮助。
答案 0 :(得分:2)
erase()是否会释放该内存,还是需要在擦除之前手动释放它?
规则:始终对delete
使用new
。 vector
并非没有魔法 - 它不知道你是如何获得指针的,所以它不会删除它,你需要这样做。
当vec超出范围时,vec中的所有foo_vec向量都会自动清理吗?
是的,他们的析构函数被调用,他们被解除分配。但是,如果析构函数不是delete[] arr;
,则会泄漏内存。
顺便提一句,这是一条很好的建议:你的代码违反了封装。您应该在析构函数和构造函数(new
和delete[]
)中分别分配(foo::arr
)和释放(foo::foo()
)foo::~foo()
所指向的内存。
最后,强制性问题:为什么foo::arr
本身不是vector<int>
?
答案 1 :(得分:2)
在
的情况下vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;
由于int
只是一个POD,因此删除了vec1的先前内容。如果vector
由指向对象而不是整数的指针组成,并且这些指针分配了new
,则必须在分配之前删除这些指针指向的内容,否则最终会导致内存泄漏示例显示:
vector<foo> vec(10);
vec[0].arr = new int[50];
vec.erase(vec.begin()); // this will *not* call delete on vec[0].arr
通常,您为自己做的事情更简单的方法是使用智能指针,如唯一指针(或者例如boost :: shared_array / scoped_array)。当向量超出范围或删除向量时,将自动调用删除(或删除[])。
struct foo
{
std::vector<int> foo_vec(50);
std::unique_ptr<int[]> arr;
}
...
vec[0].arr.reset(new int[50]);
vec[0].arr[12] = 42;
...
vec.erase(vec.begin()); // this will call delete[] on vec[0].arr
答案 2 :(得分:1)
destructor
的{{1}}没有这样做(或者如果您在删除之前没有手动执行此操作)。