mis*_*ter 46 c++ vector delete-operator
我完全混淆了在C++中删除东西的问题如果我声明了一个对象数组并且我使用了该clear()函数.我可以确定内存已经发布了吗?
例如 :
tempObject obj1;
tempObject obj2;
vector<tempObject> tempVector;
tempVector.pushback(obj1);
tempVector.pushback(obj2);
Run Code Online (Sandbox Code Playgroud)
我可以安全地打电话清除以释放所有内存吗?或者我是否需要逐个删除才能删除?
tempVector.clear();
Run Code Online (Sandbox Code Playgroud)
如果将此场景更改为对象指针,答案是否与上述相同?
vector<tempObject> *tempVector;
//push objects....
tempVector->clear();
Run Code Online (Sandbox Code Playgroud)
Ben*_*ley 81
你可以调用clear,这将破坏所有对象,但这不会释放内存.循环通过各个元素也无济于事(你甚至建议对这些对象采取什么行动?)你能做的是:
vector<tempObject>().swap(tempVector);
Run Code Online (Sandbox Code Playgroud)
这将创建一个没有分配内存的空向量,并将其与tempVector交换,从而有效地释放内存.
C++ 11也有这个函数shrink_to_fit,你可以在调用clear()之后调用它,理论上它会缩小容量以适应大小(现在为0).但是,这是一个非绑定请求,您的实现可以自由忽略它.
Use*_*ess 23
这里有两个不同的东西:
例如:
{
vector<MyObject> v;
// do some stuff, push some objects onto v
v.clear(); // 1
// maybe do some more stuff
} // 2
Run Code Online (Sandbox Code Playgroud)
在1,您明确v:这会破坏它存储的所有对象.每个人都会得到它的析构函数,如果你写了一个,那么MyObject现在已经发布了它所拥有的任何东西.
但是,vector v有权保留原始存储空间,以备日后使用时使用.
如果您决定做更多的事情推到它之间1和2,这样可以节省时间,因为它可以重复使用旧的记忆.
在2,向量v超出范围:你推入它的任何对象都1将被销毁(好像你明确地再次调用了clear),但是现在底层存储也被释放了(v不会再重复使用它了) ).
如果我更改示例所以v成为一个指针,你需要显式删除它,因为超出范围的指针2不会为你做.最好std::unique_ptr在这种情况下使用类似的东西,但如果你不这样做并且v泄露,它分配的存储也将被泄露.如上所述,您需要确保v删除,并且调用clear是不够的.
Ed *_* S. 14
vector::clear()不释放向量分配的内存来存储对象; 它为它所拥有的对象调用析构函数.
例如,如果向量使用数组作为后备存储并且当前包含10个元素,则调用clear()将调用数组中每个对象的析构函数,但是后备数组将不会被释放,因此仍然sizeof(T) * 10会为向量分配字节(至少). size()将为0,但size()返回向量中的元素数,不一定是后备存储的大小.
至于你的第二个问题,你分配给new你的任何东西都必须解除分配delete.出于这个原因,通常不会维护指向向量的指针.很少(如果有的话)有充分的理由这样做,你可以防止矢量在离开范围时被清理干净.但是,clear()无论如何分配,呼叫仍将以相同的方式运行.
移动语义允许通过简单地从空右值应用赋值 (=) 运算符来释放内存的直接方法:
std::vector<int> vec(100, 0);
std::cout << vec.capacity(); // 100
vec = vector<int>(); // Same as "vector<int>().swap(vec)";
std::cout << vec.capacity(); // 0
Run Code Online (Sandbox Code Playgroud)
它与其他答案中描述的基于“swap()”的方法一样有效(事实上,两者在概念上都在做同样的事情)。然而,当谈到可读性时,作业版本做得更好。
如果我使用
clear()成员函数。我能确定内存被释放了吗?
不,clear()成员函数会破坏向量中包含的每个对象,但它保持向量的容量不变。它影响向量的大小,但不影响容量。
如果要更改向量的容量,可以使用clear-and-minimize idiom,即创建一个(临时)空向量,然后交换两个向量。
您可以轻松了解每种方法如何影响容量。考虑以下clear()在传递的向量上调用成员函数的函数模板:
template<typename T>
auto clear(std::vector<T>& vec) {
vec.clear();
return vec.capacity();
}
Run Code Online (Sandbox Code Playgroud)
现在,考虑将empty_swap()传递的向量与空向量交换的函数模板:
template<typename T>
auto empty_swap(std::vector<T>& vec) {
std::vector<T>().swap(vec);
return vec.capacity();
}
Run Code Online (Sandbox Code Playgroud)
两个函数模板都返回返回时刻向量的容量,然后:
std::vector<double> v(1000), u(1000);
std::cout << clear(v) << '\n';
std::cout << empty_swap(u) << '\n';
Run Code Online (Sandbox Code Playgroud)
输出:
1000
0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
149268 次 |
| 最近记录: |