C++ vector::erase()还擦除结构的成员向量

C++ vector::erase()还擦除结构的成员向量,c++,vector,struct,C++,Vector,Struct,各位,我对所有这些编程语言都是新手。到目前为止,通过谷歌搜索很容易找到答案,但就在这里,我很难表达我想问的问题,让我试试:在释放内存之前擦除向量调用析构函数,对吗?现在,如果结构向量被破坏,它会如何反应?我们没有为这些东西定义析构函数,但是假设一个结构被“析构函数”时,它的每个成员的析构函数也会被调用,这是正确的吗 让我举个例子: #include <string> #include <vector> struct ding_t { std::string dan

各位,我对所有这些编程语言都是新手。到目前为止,通过谷歌搜索很容易找到答案,但就在这里,我很难表达我想问的问题,让我试试:在释放内存之前擦除向量调用析构函数,对吗?现在,如果结构向量被破坏,它会如何反应?我们没有为这些东西定义析构函数,但是假设一个结构被“析构函数”时,它的每个成员的析构函数也会被调用,这是正确的吗

让我举个例子:

#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;
}

也被释放了?对不起,我的词汇量太大了,但现在我正在尝试从指针转移到更复杂的cpp语言,相当于向量。我希望我能把我的观点讲清楚。提前感谢各位,如果已经有人问过这个问题,请重定向我,就像我说过的,我不知道如何限定这个问题。

是的,内存将自动释放

当向量被析构函数时,它将调用它包含的所有元素的析构函数。您没有为
struct
定义析构函数,因此编译器将为您提供一个默认析构函数(该函数不执行任何操作)

但是,如果向量包含指向对象的指针,则在销毁向量之前,您有责任调用对象的析构函数(因为向量将调用指针的析构函数,而不是指向对象的析构函数),如果以后没有其他方法访问它们,

请参阅您的问题和整个文章的答案,以便非常好地处理C++中的析构函数。
关于你的第二个问题:
tom[4].chuck.resize(5)分配的内存也将被释放,因为向量负责管理自己的内存分配(这是“resize()”调用的情况)。

回答:由于您没有使用
new
操作符动态分配对象,因此不必手动取消分配它们。 这是为你自动完成的

嗯。返回您的代码:)

如果要擦除第6个元素,请使用
tom.erase(tom.begin()+5)

如果要擦除所有元素,请使用
tom.erase(tom.begin(),tom.end())

要擦除前3个元素,请使用
tom.erase(tom.begin(),tom.begin()+3)

#包括
#包括
使用名称空间std;
结构设计
{
std::字符串当;
}傅;
结构吊杆{
矢量卡盘;
}酒吧;
int main(){
矢量汤姆;
汤姆(10);
tom[4].chuck.resize(5);
汤姆[4]。查克[3]。当=“杰瑞”;
//错误C2661:“擦除”:没有重载函数接受0个参数
//删除();
//删除第6个元素
tom.erase(tom.begin()+5);
//删除前3个元素:
//tom.erase(tom.begin(),tom.begin()+3);
//删除所有内容:
//tom.erase(tom.begin(),tom.end());
返回0;
}

好的,我做了这个小检查,只是为了确认一下。(为什么我没有早一点想到这一点……昨天已经很晚了……)最初的代码写得很糟糕,不起作用,对此表示歉意

这:

#包括
#包括
结构设计{
std::字符串当;
}傅;
结构吊杆{
矢量卡盘;
}酒吧;
int main(){
std::向量tom;
while(true){
汤姆(10);
tom[4].chuck.resize(5);
汤姆[4]。查克[3]。当=“杰瑞”;
tom.erase(tom.begin(),tom.end());
}
返回0;
}

不会导致内存泄漏,使用的内存是稳定的。

为您使用的语言添加标记将引起您更多的注意。对不起,我不能回答你的问题+1'dAh,著名的cpp常见问题,我没想到。谢谢大家。这真的很有帮助。现在我想起来了,我也可以在一个循环中调整大小并擦除它,然后检查它的内存使用是否会随着时间的推移而增加。
tom[4].chuck.resize(5);
#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;
}