C ++删除vector,对象,空闲内存

我完全混淆了删除C ++中的东西如果我声明一个对象数组,如果我使用clear()函数。 我能确定内存是否被释放?

例如 :

 tempObject obj1; tempObject obj2; vector<tempObject> tempVector; tempVector.pushback(obj1); tempVector.pushback(obj2); 

我可以安全地打电话清除所有的内存? 或者我需要迭代一个一个地删除?

 tempVector.clear(); 

如果这个场景被改变为对象的指针,答案会和上面一样吗?

 vector<tempObject> *tempVector; //push objects.... tempVector->clear(); 

你可以打电话清除,这将摧毁所有的对象,但这不会释放内存。 循环使用单个元素也无济于事(你甚至会build议采取什么行动来处理这些对象?)你可以做的是:

 vector<tempObject>().swap(tempVector); 

这将创build一个没有分配内存的空向量,并与tempVector交换,有效地释放内存。

C ++ 11还有函数shrink_to_fit ,你可以在调用clear()之后调用函数shrink_to_fit ,理论上它会缩小容量以适应大小(现在为0)。 然而,这是一个不具约束力的请求,您的实现可以自由地忽略它。

这里有两个独立的东西:

  1. 对象的一生
  2. 存储时间

例如:

 { vector<MyObject> v; // do some stuff, push some objects onto v v.clear(); // 1 // maybe do some more stuff } // 2 

1 ,你清除v :这将销毁它所存储的所有对象。 如果你写了一个析构函数,那么每个函数的析构函数都会被释放。 但是 ,vector v有权保留原始存储空间,以备日后使用。

如果您决定在12之间推入更多的东西,这可以节省时间,因为它可以重用旧的内存。

2 ,vectorv超出了范围:从1开始,任何被推入的对象都将被销毁(就像你明确地再次调用清除一样),但是现在底层存储也被释放了( v不会在再用它)。


如果我改变例子,所以v变成一个指针,你需要明确地删除它,因为在2范围内的指针不适合你。 在这种情况下,最好使用类似std::unique_ptr东西,但是如果你不这样做,而且v被泄露了,它所分配的存储空间也会被泄漏。 如上所述,您需要确保v被删除,调用clear是不够的。

vector::clear()不释放由vector分配的内存来存储对象; 它调用它持有的对象的析构函数。

例如,如果vector使用一个数组作为后备存储并且当前包含10个元素,那么调用clear()将会调用数组中每个对象的析构函数, 但是backing数组不会被释放 ,所以仍然有sizeof(T) * 10个字节分配给vector(至less)。 size()将为0,但size()返回向量中元素的数量,不一定是后备存储的大小。

至于你的第二个问题,你用new分配的任何东西都必须用delete来释放。 由于这个原因,您通常不会维护指向vector的指针。 很less(如果有的话)有一个很好的理由来做这件事情,并且防止向量在离开作用域时被清除。 但是,调用clear()将仍然以相同的方式运行,而不pipe它是如何分配的。

如果你需要一遍又一遍地使用这个向量,并且你的当前代码在你的循环或者每个函数调用中重复地声明它,那么很可能你的内存不足了。 我build议你在外面声明它,把它们作为函数的指针并使用:

 my_arr.resize() 

通过这种方式,您可以继续使用相同的存储器序列,而不是每次请求新的序列。 希望这有助于。 注意:将其大小调整为不同的大小可能会添加随机值。 如果需要,传递一个整数如0来初始化它们。