C ++涉及向量的内存分配问题

时间:2010-05-07 20:39:27

标签: c++ vector memory-management

vector< int > vect;
int *int_ptr = new int(10);
vect.push_back( *int_ptr );

我认为每个“新”都需要在某个时候跟“删除”,但clear()方法是否会清理这个内存?

这种做同样事情的方法怎么样:

vector< int > vect;
int int_var = 10;
vect.push_back( int_var );

据我所知,clear()调用变量析构函数,但本例中的vect.push_back()方法都在向量上推送一个对象,而不是指针。那么使用int指针的第一个例子是否需要除clear()以外的东西来清理内存?

3 个答案:

答案 0 :(得分:5)

第一种方法泄漏,因为向量永远不会占用已分配的指针。实际上,它根本不包含指针,只包含值的副本。

第二种方法不会泄漏,因为没有动态分配内存(除了向量内部 - 它将自己处理内存)。

答案 1 :(得分:5)

当您push_back on a vector时,您将向数据添加副本。因此,在这两种情况下,仍然需要释放原始数据。在第一种情况下,您需要删除它;在第二种情况下,当它超出范围时,它将被堆栈指针“释放”。

答案 2 :(得分:2)

矢量在push_back上制作副本。由于指针只是“另一个变量”(但恰好指向内存的一个),当你push_back一个先前已经分配的整数指针时,你将指针的值复制到向量中,导致潜在的悬空指针,因为它会是指向内存中相同位置的两个指针。

在第一个示例中,您需要手动删除内存。我过去用于干预图类的一种策略是使用类似的东西(由于工作和快速打字而大量编辑的东西):

class graph //quick-format
{
vector<node*> nodes;
add_node(node n)
{
  node *temp = new node; 
  *temp = n; 
  nodes.push_back(temp) 
}
~graph()
{ 
   for(int i = 0; i < nodes.size(); i++) 
      delete nodes[i]; 
}
};

作为警告,必须检查图形的复制语义。就目前而言,它将导致删除以前免费的内存。优点是您可以始终拥有相同的节点集。 Caveat Emptor ,就像直接使用内存一样..

但是,如果只是推送一个非指针变量,则不会有内存泄漏。可能传感器会泄漏,但是......在工具成熟的这一点上实际上是不可能的。