释放指针向量的两种不同方法 - 为什么不起作用?

Yan*_* Yi 0 c++ pointers memory-leaks memory-management

我有一个指向结构的指针向量.解除分配内存的第一种方法工作正常,但第二种方法在执行后会产生分段错误(核心转储).为什么会这样?两个看起来都对我不对.用g ++编译.

struct milkNode {
    int unitCost;
    int unitsAvail;
};

int main() {

    //previous code

    for (int i = 0; i < M; ++i) {
        milkNode *cur = new milkNode;
        cur->unitCost = cost;
        cur->unitsAvail = avail;
        allNodes.push_back(cur);
    }


    //Method 1, works fine
    vector<milkNode*>::iterator iter;

    for (iter = allNodes.begin(); iter != allNodes.end(); ++iter) {
        delete *iter;
    }

    allNodes.clear();

    //Method 2, segmentation fault after execution. Compiles without errors.
    //Segmentation fault occurs just before the last "after" is printed

    /*
    vector<milkNode*>::iterator iter;
    for (iter = allNodes.begin(); iter != allNodes.end(); ++iter) {
        milkNode *delThis = allNodes.back();
        allNodes.pop_back();
        cout << "before" << endl;
        delete delThis; //Attempted to put this statement before pop_back, still seg fault.
        cout << "after" << endl;
    }*/

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

已经浏览了几个像这样的stackoverflow帖子:删除指针的向量,但它们似乎没有回答我的问题.

Ala*_*kes 6

在某些时候iter将引用列表中的最后一个元素,并在循环中弹出该元素并将其删除.这会使迭代器失效,然后您有未定义的行为 - end()不能依赖后续的测试和增量.

由于您实际上不需要迭代器,因此更换起来会容易得多

for (iter = allNodes.begin(); iter != allNodes.end(); ++iter) {
Run Code Online (Sandbox Code Playgroud)

while (!allNodes.empty()) {
Run Code Online (Sandbox Code Playgroud)

这可以避免这个问题.