0

我有一些关于内存管理如何用于 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());
}

由于我erase()在第一个包含 arr 的向量元素上使用了分配的内存,是erase()释放该内存还是需要在擦除之前手动释放它?此外,当vec超出范围时,是否会自动清理所有foo_vec向量?vec谢谢你的帮助。

4

3 回答 3

2

擦除()是否释放该内存或者我需要在擦除之前手动释放它?

规则:始终delete为每个new. vector不是没有魔法 - 它不知道你是如何获得那个指针的,所以它不会删除它,你需要这样做。

此外,当 vec 超出范围时,是否会自动清理 vec 中的所有 foo_vec 向量?

是的,它们的析构函数被调用并且它们被释放。但是,如果析构函数没有,您将泄漏内存delete[] arr;


顺便说一句,一个很好的建议:你的代码违反了封装。您应该分别在析构函数和构造函数(和)中分配( new)和释放(delete[])指向的内存。foo::arrfoo::foo()foo::~foo()

最后,强制性问题:为什么foo::arr不是 avector<int>本身?

于 2013-03-06T06:32:50.447 回答
2

如果是

vector<int> vec1(10);
vector<int> vec2(10);        
vec1 = vec2;

vec1 之前的内容被删除,因为int它只是一个 POD。如果vector由指向对象而不是 int 的指针组成并且这些被分配,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
于 2013-03-06T07:15:40.463 回答
1
  1. 当然会被清理干净。
  2. 不,如果destructoroffoo不这样做(或者如果您在擦除之前不手动执行)。
于 2013-03-06T06:30:38.120 回答