【问题标题】:C++ - Map iterator access results in segfaultC++ - 映射迭代器访问导致段错误
【发布时间】:2012-04-06 19:41:07
【问题描述】:

我试图完全重新表述这个问题。情况如下:

 class Departure {
    private :
      unsigned int supply;

    public : 
     Departure(int);
     ~Departure();
     int getSupply()  {
       return supply;
     };
};


class Route {
    private :
       Departure* departure;
    public :
       Departure& getDeparture() { 
          return *departure;
        };
};

class Plan {
    private :      
       std::map<Route*, double> quantities;
    public :
       void addRoute(Route& rt)  {
          quantities.insert(std::pair<Route*,double>(&rt,0));
        };

       void createSolution() {  
          std::map<Route*, double>::iterator it;    
          for(it = quantities.begin(); it != quantities.end(); ++it) {      
             it->second = it->first->getDeparture().getSupply();                        
           };
};

添加路线后 - 我已经检查过,它工作正常,我得到一个段错误,从我的试验和错误到现在位于 it-&gt;first-&gt;getDeparture().getSupply() 调用中。任何解释为什么?

【问题讨论】:

  • 向我们展示如何定义和填充quantities
  • 在 C++ 中使用指针通常是一个非常糟糕的主意。
  • @KerrekSB 什么?你能澄清一下最后的评论吗?
  • @Lirik:这在 SO 上一遍又一遍地出现。多花几天时间,我相信某处会有更实质性的帖子。或搜索有关该主题的一些过去的帖子。基本上,C++ 有比指针更好、更惯用的处理动态对象的工具,而且动态对象一开始就很少需要。
  • @Lirik 这仅适用于带有遗留元素的代码。指针在现代 C++ 代码中已经过时了。对于任何在 2012 年编写新代码的人来说,除了与旧代码交互之外,我很难看到指针在哪些地方实际上是有用或可取的。新的 C++11 标准使 C++ 成为一种几乎完全内存安全的语言,现在您可能更可能在 C# 和 Java 等托管语言中比在 C++ 代码中泄漏资源。 (不幸的是,仍然会编写不安全的代码,因为许多 C++ 程序员仍然“卡”在 1990 年代)

标签: c++ iterator segmentation-fault


【解决方案1】:

我猜(99% 肯定)你正面临一个悬空指针的问题,也就是说,当你调用 createSolution 时,指向 Route 和 Departure 对象的指针不再有效。

解决这个问题的简单方法是不使用指针,而是将 Route 和 Departure 对象存储为值。无论如何,将它们存储为指针并没有太大的好处,考虑到对象是如此之小......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多