释放std :: list成员

时间:2012-03-12 04:52:21

标签: c++ stl dynamic-memory-allocation

我在std::list<BunnyInfo> bList;是一个结构的类中有一个列为BunnyInfo私有的列表

struct BunnyList::BunnyInfo {
    std::string name;
    char gender;
    std::string color;
    unsigned int age : 6; // 0 - 63
    bool mutant;
};

列表通过成员函数增长

void BunnyList::add(int count){
    bListIter iter;
    while(count--){
        BunnyInfo *bNew = &fill(*new BunnyInfo());
        for(iter = bList.begin(); iter != bList.end(); iter++){
            if(iter->age <= bNew->age)
                break;
        }
        bList.insert(iter, *bNew);
    }
}

其中fill()只是一个为结构生成值的函数。我还有一个删除列表一半的成员函数

void BunnyList::reap(){
    int toKill = bList.size() / 2;
    int find;
    bListIter iter;
    while(toKill--){
        find = rng(0, bList.size()-1);
        iter = bList.begin();
        for(int i = 0; i < find; i++)   // traverse list to the find-th node;
            iter++;
        delete &(*iter);
        bList.erase(iter);
    }
}

我的问题是,如何删除列表成员,同时释放通过add()分配的资源。我认为delete &(*iter);会产生错误,因为没有它,程序运行正常。但是,简单地调用erase()并不会释放与列表节点关联的BunnyInfo

我刚开始使用STL。

1 个答案:

答案 0 :(得分:5)

由于列表已声明为std::list<BunnyInfo>,因此其insert会复制正在插入的对象,erase会自动处理该副本。因此,您无需也无法在该副本上使用delete

由于addnew分配了一个不delete的对象(并且不存储在任何数据结构中),因此add中存在内存泄漏

如果要在列表中存储指针,则需要将列表声明为std::list<BunnyInfo *>