【问题标题】:Two different ways of deallocating vector of pointers - why doesn't one work?释放指针向量的两种不同方法 - 为什么一种不起作用?
【发布时间】:2015-01-03 16:21:27
【问题描述】:

我有一个指向结构的指针向量。第一种释放内存的方法工作正常,但第二种方法在执行后会出现分段错误(核心转储)。为什么呢?两者对我来说都是正确的。使用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,但他们似乎没有回答我的问题。

【问题讨论】:

  • 您可以存储std::unique_ptr 的向量,因此您不必担心释放方案。

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


【解决方案1】:

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

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

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

while (!allNodes.empty()) {

这样可以避免问题。

【讨论】:

  • 谢谢。我看错地方了,以为是我的指针释放问题。
【解决方案2】:

让我们看一下循环的“最后一次”迭代:

iter 等于 allNodes.end() - 1。然后你在allNodespop_back(),现在iter 等于allNodes.end()。最后我们回到循环头,你增加了iter,现在是allNodes.end() + 1

这就是你的循环失败的地方。

【讨论】:

    【解决方案3】:

    第二个应该是:

    while (!allNodes.empty()) {
        milkNode *delThis = allNodes.back();
        allNodes.pop_back();
        delete delThis;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2013-04-05
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多