对象向量的C ++内存管理

时间:2013-03-06 06:26:25

标签: c++ memory-management vector

我有一些关于内存管理如何适用于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向量都会自动清除吗?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

  

erase()是否会释放该内存,还是需要在擦除之前手动释放它?

规则:始终对delete使用new vector并非没有魔法 - 它不知道你是如何获得指针的,所以它不会删除它,你需要这样做。

  

当vec超出范围时,vec中的所有foo_vec向量都会自动清理吗?

是的,他们的析构函数被调用,他们被解除分配。但是,如果析构函数不是delete[] arr;,则会泄漏内存。


顺便提一句,这是一条很好的建议:你的代码违反了封装。您应该在析构函数和构造函数(newdelete[])中分别分配(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)

  1. 当然会被清理干净。
  2. 不,如果destructor的{​​{1}}没有这样做(或者如果您在删除之前没有手动执行此操作)。