vector :: erase()也擦除了struct的成员向量

时间:2011-12-29 09:41:06

标签: c++ vector 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语言相当于矢量。我希望我明白我的观点。先谢谢你们,如果已经有人问过,请重新定位我,正如我所说,我不知道如何限制这个问题。

4 个答案:

答案 0 :(得分:4)

是的,内存将自动释放。

当一个向量被破坏时,它将调用它包含的所有元素的析构函数。您没有为struct定义析构函数,因此编译器将为您提供一个默认值(无效)。

但是,如果你的向量包含指向对象的指针,那么在破坏向量之前,负责在对象上调用析构函数(因为向量将调用指针的析构函数,而不是尖头对象。

答案 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;
}

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