人们,我是所有这些编程谈话的新手。到目前为止,通过谷歌搜索找到答案很容易,但就在这里我很难表达我想问的问题,让我试试:在释放内存之前擦除一个向量调用析构函数,对吧?现在,如果结构向量被破坏,它如何反应?一个人没有为这些东西定义析构函数,但是假设如果一个结构被“破坏”它的每个成员的析构函数也会被调用它是正确的吗?
让我举个例子:
#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语言相当于矢量。我希望我明白我的观点。先谢谢你们,如果已经有人问过,请重新定位我,正如我所说,我不知道如何限制这个问题。
答案 0 :(得分:4)
是的,内存将自动释放。
当一个向量被破坏时,它将调用它包含的所有元素的析构函数。您没有为struct
定义析构函数,因此编译器将为您提供一个默认值(无效)。
但是,如果你的向量包含指向对象的指针,那么在破坏向量之前,你负责在对象上调用析构函数(因为向量将调用指针的析构函数如果您以后没有其他方法可以访问它们,那么em>,而不是尖头对象。
答案 1 :(得分:2)
请参阅http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11以获取问题的答案以及整篇文章,以便对C ++中的析构函数进行非常好的处理。
关于你的第二个问题:是的,由tom[4].chuck.resize(5);
分配的内存也将被释放,因为 vector 负责管理自己的内存分配(这是“resize()”调用的情况。)
答案 2 :(得分:1)
答案:由于您没有使用new
运算符动态分配Object,因此您不必手动取消分配它们。
这是自动完成的。
确定。回到你的代码:)
如果要删除第6个元素,请使用tom.erase (tom.begin()+5)
。
如果要删除所有元素,请使用tom.erase (tom.begin(),tom.end() )
。
要删除前3个元素,请使用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;
}
答案 3 :(得分: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;
}
导致内存泄漏,使用的内存稳定。