带有指针/非指针的C++分段错误

C++ Segmentation Fault with Pointer/Non Pointer

本文关键字:指针 C++ 分段 错误      更新时间:2023-10-16

它告诉我这里有一个分段错误:

class Atelier  /* Director qui va executer les méthodes du monteur */
{
private:
MonteurVoiture *_monteur;
public:
Voiture* doTheJob();
Atelier(MonteurVoiture *mont);
};
int main()
{
MonteurVoiture *monteur=MonteurVoiture::instanceVoiture("luxe");
Atelier a(monteur);
cout << a.doTheJob() << endl;
return 0;
}

如果没有cout << a.doTheJob() << endl;,它就可以工作。如果我用cout<lt;"好";没关系。因此,这种方法产生了分割错误。

Atelier::Atelier(MonteurVoiture *mont) { _monteur=mont; }
Voiture* Atelier::doTheJob()
 {
 _monteur->createVoiture();
 _monteur->addPortiere();
 _monteur->addSiege();
 return _monteur->getVoiture();
}

Voiture

class Voiture
{
private:
std::string portiere;
std::string siege;
public:
void setPortiere(std::string p);
void setSiege(std::string s);
friend std::ostream &operator<<(std::ostream &o,const Voiture *v);
};

和MonteurVoiture

class MonteurVoiture  
{
protected:
Voiture *v;
public:
~MonteurVoiture();
Voiture* createVoiture();
Voiture* getVoiture();
virtual void addPortiere() =0;
virtual void addSiege() =0;
static MonteurVoiture* instanceVoiture(std::string type);
};
Voiture* MonteurVoiture::createVoiture() { return new Voiture(); }
Voiture* MonteurVoiture::getVoiture() { return v; }

提前感谢

快速修复

好的,首先解决你的问题:

class MonteurVoiture  
{
protected:
       Voiture *v; // how is this being set??? 
public:
            ~MonteurVoiture();
    Voiture* createVoiture();
    Voiture* getVoiture();
    virtual void addPortiere() =0;
    virtual void addSiege() =0;
    static MonteurVoiture* instanceVoiture(std::string type);
};
Voiture* MonteurVoiture::createVoiture() { return MonteurVoiture::v = new Voiture(); }
                                         // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  you need this
Voiture* MonteurVoiture::getVoiture() { return v; }

问题的出现是因为你根本没有设置Voiture*v值,但你在doTheJob()中使用了它:

Voiture* Atelier::doTheJob()
 {
     _monteur->createVoiture();
     _monteur->addPortiere();
     _monteur->addSiege();
     return _monteur->getVoiture(); /* this is undefined without the fix in createVoiture() above */
}

总体设计问题

你的物品设计很奇怪。你有一辆汽车(Voiture类),然后你在MonteurVoiture中对其进行修改。控制汽车的是什么?

您可以考虑以下结构:

class Option {
public:
      virtual std::string name() = 0; /* name of the option */
      void add(Voiture &v) {
             v.addOption(this);
      }   
      virtual std::string getDetails() = 0;  /* details of the option */
};
class optionDeSeiges: public Option {
public:
      virtual inline std::string name() { return "Sieges"; }
};
virtual std::string getDetails() {
}
class Voiture {
      std::List<Option *> options; /* an array of options */
      void addOption(Option *o) {
           options.add(o);
      }
}

注意:以上大部分都是伪代码,它应该向您展示替代概念,从中获取想法,而不是逐字逐句地复制

我用了Valgrind,上面写着:

==19269==    at 0x38B0D: std::string::assign(std::string const&) (in /usr/lib/libstdc++.6.0.9.dylib)
==19269==    by 0x100001E02: Voiture::setPortiere(std::string) (in ./main.exe)
==19269==    by 0x1000018AA: MonteurVoitureLuxe::addPortiere() (in ./main.exe)
==19269==    by 0x10000120C: Atelier::doTheJob() (in ./main.exe)
==19269==    by 0x100002029: main (in ./main.exe)

MonteurVoitureLuxe 的addPortiere方法

void MonteurVoitureLuxe::addPortiere() { v->setPortiere("diamand"); }

以及Voiture 的setPortiere

void Voiture::setPortiere(std::string p) { this->portiere=p; }