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年代仍处于“停滞状态”。