繁体   English   中英

vector :: erase()也会删除结构的成员向量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM