Vector::erase()也擦除结构体的成员向量

vector::erase() also erases member-vectors of a struct

本文关键字:结构体 向量 擦除 成员 erase Vector      更新时间:2023-10-16

各位,我是第一次接触这些编程话题。到目前为止,通过谷歌很容易找到答案,但在这里,我很难表达我想问的问题,让我试试:在释放内存之前,删除一个向量调用析构函数,对吧?现在,如果结构向量被析构,它会如何反应?人们没有为这些东西定义析构函数,但是假设如果一个结构被"析构",它的每个成员的析构函数也将被调用,这是正确的吗?

让我给你一个例子:

#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定义析构函数,因此编译器将为您提供一个默认的析构函数(它不做任何事情)。

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

请参阅http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11以获得您问题的答案,并参阅整篇文章以获得c++中析构函数的良好处理。

关于你的第二个问题:是的,tom[4].chuck.resize(5);分配的内存也将被释放,因为它是向量的责任来管理自己的内存分配(这是"resize()"调用的情况。

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

Ok。回到你的代码:)

如果你想擦除第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;
}

好的,我做了这个小检查,只是为了确保。为什么我没有早点想到这一点……昨天很晚……最初的代码写得很糟糕,不能工作,为此道歉。

:

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

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