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()以外的东西来清理内存?
答案 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 ,就像直接使用内存一样..
但是,如果只是推送一个非指针变量,则不会有内存泄漏。可能传感器会泄漏,但是......在工具成熟的这一点上实际上是不可能的。