我与问候完全糊涂在C删除的东西++如果我宣布对象的数组,如果我使用clear()
函数。 我可以肯定的是内存被释放?
例如 :
tempObject obj1;
tempObject obj2;
vector<tempObject> tempVector;
tempVector.pushback(obj1);
tempVector.pushback(obj2);
我可以安全地调用明确释放了所有的记忆? 或者我需要遍历删除一个接一个?
tempVector.clear();
如果这种情况下更改为对象的指针,将答案是上面一样?
vector<tempObject> *tempVector;
//push objects....
tempVector->clear();
您可以拨打清晰,这将摧毁所有的对象,但不会释放内存。 通过各个元素循环也不会有帮助(什么动作,你甚至会建议采取的对象吗?)你可以做的是这样的:
vector<tempObject>().swap(tempVector);
这将创建一个没有分配的内存空载体,并与tempVector交换,从而有效解除分配内存。
C ++ 11还具有功能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
:这会破坏所有它存储的对象。 每个被调用析构函数,如果你写了一个,并通过所拥有的任何MyObject
,现予以公布。 但是 ,向量v
有保持原始数据存储在左右你想它以后情况的权利。
如果您决定做更多的事情推到它之间的1
和2
,这样可以节省时间,因为它可以重复使用旧的记忆。
在2
,向量v
超出范围:因为你推入它的任何对象1
将被破坏(如如果你明确要求再次明确),但现在底层的存储也被释放( v
不会被周围的再用它了)。
如果我修改这个例子, v
变成一个指针,你需要明确地将其删除,因为指针走出去的范围在2
不为你做的。 这是更好地使用类似std::unique_ptr
在这种情况下,但如果你不和v
被泄露,其分配的存储空间会被泄露也是如此。 如上所述,你需要确保v
被删除,并要求clear
是不够的。
vector::clear()
不通过来存储对象的矢量分配的空闲存储器; 它要求其持有的对象的析构函数。
例如,如果所述载体使用数组作为后备存储和目前包含10个元素,则调用clear()
将调用阵列中每个对象的析构函数, 但背衬阵列将不会被释放 ,因此仍有sizeof(T) * 10
分配给矢量字节(至少)。 size()
为0,但size()
返回元件的载体中的号码,不一定后备存储器的大小。
至于你的第二个问题,任何你分配与new
,你必须取消分配delete
。 您通常不保持一个指向这个原因的向量。 有很少(如果有的话)一个很好的理由这样做,可以防止载体从当它离开范围被清理。 但是,调用clear()
仍然会采取同样的方式,无论它是如何分配的。
如果您需要一遍又一遍地使用矢量和当前的代码声明它的反复循环中或在每一个函数调用,很可能你会耗尽内存。 我建议你外面声明它,把它们作为你的功能和使用指针:
my_arr.resize()
这样一来,你一直使用相同的内存序列的载体,而不是请求新的序列每次。 希望这有助于。 注意:它调整到不同的尺寸可能会增加随机值。 传递一个整数,如0来初始化它们,如果需要的话。