C++ C++;-映射迭代器访问导致segfault

C++ C++;-映射迭代器访问导致segfault,c++,iterator,segmentation-fault,C++,Iterator,Segmentation Fault,我试图把这个问题完全重新表述出来。情况如下: class Departure { private : unsigned int supply; public : Departure(int); ~Departure(); int getSupply() { return supply; }; }; class Route { private : Departure* departu

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

 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();                        
           };
};
离班{
私人:
无符号整数供应;
公众:
离境(国际);
~离开();
int getSupply(){
返回供应;
};
};
班级路线{
私人:
出发*出发;
公众:
出发(&GetDeviation(){
返回*离开;
};
};
课堂计划{
私人:
标准::地图数量;
公众:
无效添加路线(路线和rt){
数量。插入(标准::对(&rt,0));
};
void createSolution(){
std::map::it迭代器;
对于(it=quanties.begin();it!=quanties.end();++it){
it->second=it->first->GetDeviation().getSupply();
};
};
添加路线后-我已经检查过,它工作正常,我得到一个segfault,从我的试用到现在,它位于
it->first->getdefaction().getSupply()
调用中。有什么解释吗?

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

解决这一问题的简单方法是不使用指针,而是将路由和出发对象存储为值。无论如何,将它们存储为指针没有多大好处,因为对象太小了…

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


简单的解决方法是不使用指针,而是将路径和离开对象存储为值。考虑到对象太小,无论如何都没有太大的好处。

显示了如何定义<代码>量< /C> >。使用C++中的指针通常是一个非常糟糕的想法。@ KerrekSB?请你澄清一下最后一条评论?@里里克:这是一次又一次地出现。只要挂上几天的时间,我肯定会有更大的帖子。或者,通过搜索过去的帖子来讨论这个话题。基本上,C++有比指针更好的、更惯用的处理动态对象的工具,动态对象是RA。首先,在现有的代码中,指针是非常正确的。指针在现代C++代码中已经过时了;对于任何在2012编写新代码的人,我很难看到指针除了与旧代码接口之外,实际上是有用的或可取的。新的C++ 11标准使C++成为了一种。几乎完全是内存安全的语言,现在你可能更容易在C++语言和java语言中泄漏资源,而C++代码却不安全。(不幸的是,不安全的代码仍然被写入,因为许多C++程序员在20世纪90年代仍然“滞留”。C++中的指针通常是一个非常糟糕的想法。“KerrekSB?什么?你能澄清最后一个评论吗?”里里克:这一次反复出现。只需挂几天,我肯定会有更大的帖子。或者搜索过去的帖子。基本上,C++比指针更适合于处理动态对象,而动态对象在一开始就很少需要。@ LILIK对于遗留元素的代码来说是非常正确的。指针在现代C++代码中已经过时了;对于任何在2012编写新代码的人来说,我都很难看到WHER。E指针除了与旧代码接口之外,实际上是有用的或可取的。新的C++ 11标准使C++几乎完全是内存安全的语言,现在,你可能更容易在C++语言和java语言中比C++代码泄漏资源。(不幸的是,不安全的代码仍然被写入,因为许多C++程序员在20世纪90年代仍处于“停滞状态”。