对象矢量的自由记忆(不是对象的ptrs)

时间:2016-10-07 18:30:13

标签: c++ memory-management vector memory-leaks g++

我宣布了矢量:

vector<Object> my_vect;

我将一些物体推入其中,如

my_vect.push_back(*(new Object()));

我知道如果我要声明一个指针向量会很简单,但这对我的代码至关重要。

我尝试使用

my_vect.clear() 

但无济于事。

此外,我还尝试获取指向对象的指针,如:

vector<*Object> new_my_vect;

for(int i = 0; i < my_vect.size(); i++)
{
    new_my_vect.push_back(&my_vect[i]);
}

for(int i = 0; i < new_my_vect.size(); i++)
{
    delete new_my_vect[i];
}

但是我收到了“free(): invalid pointer:”错误。

感谢-你,

3 个答案:

答案 0 :(得分:1)

您应该按如下方式添加对象

vector<Object> my_vect;

my_vect.emplace_back();

my_vect.push_back(Object());

我不建议在向量中获取指向对象的指针,就好像导致向量重新分配这些指针的任何东西都会失效,因为底层数组将被复制到别处。

答案 1 :(得分:1)

  

*(new Object())

这是内存泄漏。它在堆上创建一个新对象,取消引用它,创建一个副本(除非vector :: push_back使用移动语义),然后泄漏堆分配保留的内存。

  

矢量&lt; *对象&gt; new_my_vect;

     

for(int i = 0; i&lt; my_vect.size(); i ++)      {          new_my_vect.push_back(安培; my_vect [I]);      }

     

for(int i = 0; i&lt; new_my_vect.size(); i ++)      {          删除new_my_vect [i];      }

这是获取矢量本身存储的对象的地址。绝对保证与传递给向量的对象的地址不一致。矢量可以随意重新分配和重新排列它的内部存储器。只要您不修改向量,只能在向量中获取对象的地址是安全的。使用删除释放此内存无效。

这里的问题在于,您是按值在向量中存储对象而不是按地址存储对象。改为存储指针。这样你可以添加堆分配的对象,然后循环遍历向量并在完成后释放它们。这样它只复制指针,而不是对象。

vector<Object*> objs;
for (int i = 0 ; i < 10 ; ++i) {
    objs.push_back(new Object());
}
for (unsigned int i = 0 ; i < vec.size() ; ++i) {
    delete objs[i];
}

答案 2 :(得分:1)

这样做

my_vect.push_back(*(new Object()));

结果如下:

  1. 在堆上创建对象。

  2. 对象的指针被解除引用*(..)并在push_back中作为参数传递。

  3. 存储在矢量中时,会创建此对象的副本

  4. 一旦push_back返回,最初创建的Object仍然被分配,没有人能够解除分配,因为它的指针不再存在。因此产生了内存泄漏。

  5. 如前所述,如果你需要一个“对象”对象的矢量,你可以传递在堆栈上创建的对象

    my_vect.push_back(Object());