c++ - 释放指针 vector 的两种不同方法——为什么一种方法不起作用?

标签 c++ pointers memory-management memory-leaks

我有一个指向结构的指针 vector 。第一种释放内存的方法工作正常,但第二种方法在执行后会出现段错误(核心转储)。为什么会这样?两者对我来说都是正确的。使用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;
}

已经浏览过一些像这样的 stackoverflow 帖子:Deleting vector of pointers , 但他们似乎没有回答我的问题。

最佳答案

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

因为你实际上并不需要迭代器,所以替换它会容易得多

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

while (!allNodes.empty()) {

这样可以避免问题。

关于c++ - 释放指针 vector 的两种不同方法——为什么一种方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756848/

相关文章:

python - 如何在 Windows 中查找 python 进程/对象使用的内存总量

objective-c - 在 Block 中释放 View Controller 的位置

c++ - C/C++ — 使用 __funcsig__ 宏来获取函数签名?

c++ - 如何将 DLL 反转为 C++ 代码?

c++ - 类模板的 constexpr 运算符重载

ios - 无法理解 NSError/NSObject 指针传递行为

c++ - 如何构造一个填充了一些统一值的 std::array ?

c++ - 指向数组元素的成员指针

string - Win32开发-C++中字符串相关的数据类型

c - 将值赋给 ScanF 中的 char *