在代码块结束之前释放分配给std :: vector <int>的内存的正确方法</int>

时间:2012-12-31 17:34:28

标签: c++ stl

我知道如果我在堆栈上创建了一个向量,如下所示:

void foo(){
std::vector<int> vec;

}

foo完成执行后,释放分配给vec的内存。但是,我如何在foo内释放这段记忆。我不是在寻找vec.clear()因为它只是清除容器,它释放了分配给容器的内存。

4 个答案:

答案 0 :(得分:7)

使用{}范围块来更紧密地控制向量的生命周期:

void foo()
{
   {
      std::vector<int> vec;
      // stuff that uses vec
   }

   // stuff that doesn't
}

可以在C ++ 11和attempt trickery-related equivalents in C++03中使用shrink_to_fit,但为什么?!

答案 1 :(得分:2)

你绝对不需要做任何事情。它将自行处理,因为向量类中的析构函数会破坏向量,并在函数末尾变量超出范围时释放内存。

编辑:如果你真正想做的事情就像是在一个bazilion数字中读取,然后删除所有那些不能被6,7,2整除但不等于42的那些,那么我' d说最好创建第二个向量来存储你不想保留的数字,然后让原始向量超出范围。

答案 2 :(得分:0)

如果上面提出的vec.resize(0); vec.shrink_to_fit();(C ++ 11)不可用,您可以获得与vector<int>().swap(vec);非常相似的内容。虽然将它放入额外的{}块是可取的,如果可以这样做(并不总是容易,但通常可行)。

但是,请注意,使用临时交换很可能会为您交换的临时对象执行(不必要的)动态分配,并将一个小块分配到当前范围的末尾。
它显然也不会释放4-8字节的内存实际 vector对象 - 而不是它所拥有的数据 - 占用堆栈(只有范围的结尾可以那样做。)

也就是说,在大多数情况下,整个努力都是徒劳的。如果以后需要在同一范围内使用大量内存,那么无论是提前还是延迟释放向量都无关紧要。要么它已经很早就失败了(在这种情况下,整个问题都没有出现!),或者它将以任何一种方式工作到函数的末尾。

另一方面,如果你知道你以后会在同一个函数中使用需要大量的内存(比如,另一个类似大小的矢量),那么可以预期这会变成一个问题,很难预测释放第一个是否真的有所作为(想想碎片,特别是在做swap伎俩时)。
如果第二个向量的大小与第一个向量相同或者小于第一个向量,则只能期望它可靠地工作,在其他情况下,它不能保证更好地工作。

答案 3 :(得分:0)

在我看来,你可以通过以下方式释放在向量中分配的完整内存:
1.使用方法clear()调整向量的大小,然后使用shrink_to_fit()确保向量中的所有元素实际释放。
2.如果您的向量包含指针元素,则使用智能指针(shared_ptr,unique_ptr)而不是原始指针(在ANSI C中)。
3.如果您使用了原始指针,那么在停止使用它们时不要忘记释放它们。