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)。 然而,这是一个不具约束力的请求,您的实现可以自由地忽略它。
这里有两个独立的东西:
- 对象的一生
- 存储时间
例如:
{ vector<MyObject> v; // do some stuff, push some objects onto v v.clear(); // 1 // maybe do some more stuff } // 2
在1
,你清除v
:这将销毁它所存储的所有对象。 如果你写了一个析构函数,那么每个函数的析构函数都会被释放。 但是 ,vector v
有权保留原始存储空间,以备日后使用。
如果您决定在1
到2
之间推入更多的东西,这可以节省时间,因为它可以重用旧的内存。
在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来初始化它们。