2013-03-06 101 views
0

我有几个关于内存管理如何为矢量工作的问题/示例。C++内存管理对象矢量

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超出范围,vec中的所有foo_vec载体自动清理?谢谢你的帮助。

回答

2

自从int VEC 1的以前的内容被删除的

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

的情况下只是一个POD。如果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 

通常情况下,为了让自己的事情变得简单,你需要使用智能指针,如独特的指针(或者eg提高:: 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 
+0

如果'vec1'和'vec2'包含结构呢?那么会有内存泄漏吗? – locke14 2014-04-04 07:52:05

+0

这取决于。当你把东西放入矢量中时,你需要决定谁拥有这些实例。 – 2014-04-04 21:46:40

1
  1. 当然它会被清理。
  2. 不,如果destructorfoo没有这样做(或者如果您在擦除之前没有手动执行此操作)。
2

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

规则:每个new总是使用deletevector不是没有魔力 - 它不知道你是如何获得该指针的,所以它不会删除它,你需要这样做。

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

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


顺便提一下,一条好建议:你的代码违反了封装。您应该分别分配(new)和免费(delete[]foo::arr指向的内存在析构函数和构造函数(foo::foo()foo::~foo())中。

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

+0

哦,这些只是我编造的例子,以帮助我更好地理解,而不是我正在编写的实际代码。 – roverred 2013-03-06 07:27:32