[英]vector::erase() also erases member-vectors of a struct
亲爱的,我对所有这些编程话题都是陌生的。 到目前为止,通过谷歌搜索找到答案还是很容易的,但是在这里我很难表达我想问的问题,让我尝试一下:擦除向量在释放内存之前调用析构函数,对吗? 现在,如果结构向量被破坏,它将如何反应? 并没有为这些事情定义析构函数,但是假设如果一个结构被“析构”了,那么其成员的每个析构函数也会被调用是否正确?
让我给你举个例子:
#include <string>
#include <vector>
struct ding_t {
std::string dang;
} foo;
strung boom_t {
vector <ding_t> chuck;
} bar;
int main () {
vector <boom_t> tom;
tom.resize(10);
tom[4].chuck.resize(5);
tom[4].chuck[3].dang = "jerry";
tom.erase();
return 0;
}
在这种情况下,将由
tom[4].chuck.resize(5);
也被释放? 抱歉,我的词汇很抱歉,但是目前,我正尝试从指针转向更复杂的cpp语言,即vector。 我希望我能理解我的意思。 预先谢谢大家,如果已经问过这个问题,请直接重定向我,正如我已经说过的,我不知道如何限制这个问题。
是的,内存将自动释放。
销毁向量时,它将调用其包含的所有元素的析构函数。 您没有为struct
定义析构函数,因此编译器将为您提供默认的析构函数(不执行任何操作)。
但是,如果向量包含指向对象的指针,则您有责任在破坏向量之前在对象上调用析构函数(因为向量将调用指针的析构函数,而非指针对象),如果您没有其他访问方法他们以后。
有关您问题的答案,请参见http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11 ;有关对C ++中的析构函数的很好处理,请参见整篇文章。
关于第二个问题:是的,由tom[4].chuck.resize(5);
分配的内存tom[4].chuck.resize(5);
也将被释放,因为管理它自己的内存分配是向量的责任(“ resize()”调用就是这种情况。)
答:由于您不是使用new
运算符动态分配对象,因此不必手动取消分配它们。 为您自动完成。
好。 返回您的代码:)
如果要删除第6个元素,请使用tom.erase (tom.begin()+5)
。
如果要删除所有元素,请使用tom.erase (tom.begin(),tom.end() )
。
要删除前三个元素,请使用tom.erase (tom.begin(),tom.begin()+3)
。
#include <string>
#include <vector>
using namespace std;
struct ding_t
{
std::string dang;
} foo;
struct boom_t {
std::vector <ding_t> chuck;
} bar;
int main () {
vector <boom_t> tom;
tom.resize(10);
tom[4].chuck.resize(5);
tom[4].chuck[3].dang = "jerry";
//error C2661: 'erase' : no overloaded function takes 0 parameters
//tom.erase( );
// erase the 6th element
tom.erase (tom.begin()+5);
// erase the first 3 elements:
//tom.erase (tom.begin(),tom.begin()+3);
// erase everything:
//tom.erase (tom.begin(),tom.end() );
return 0;
}
好的,我已经做了一点检查,只是为了确保。 (为什么我没有更早想到这个……昨天已经很晚了……)最初的代码写得不好,没有用,为此深表歉意。
这个:
#include <string>
#include <vector>
struct ding_t {
std::string dang;
} foo;
struct boom_t {
std::vector <ding_t> chuck;
} bar;
int main () {
std::vector <boom_t> tom;
while (true) {
tom.resize(10);
tom[4].chuck.resize(5);
tom[4].chuck[3].dang = "jerry";
tom.erase( tom.begin(), tom.end() );
}
return 0;
}
不会导致内存泄漏 ,已用内存稳定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.