c++ - 尝试实现工厂模式时如何修复 'Segmentation fault (core dumped)'

标签 c++ object pointers design-patterns factory-pattern

我正在尝试在我的代码中实现工厂模式。

我尝试创建一个对象“Koerper schienbein”并用

初始化它
schienbein.setRadius(0.2);
schienbein.setLaenge(1.0);
schienbein.setPosition(0, 0, 1.0);
schienbein.erzeugeBody(world); 

因此我假设“Koerper”类中没有错误。

这是我的工厂代码。

Koerperfabrik.h:

class Koerperfabrik {

public:
    Koerper *erzeugeKoerperteil(dWorldID welt);

protected:
    virtual Koerper *erzeugeKoerper(dWorldID welt) { };

};

Koerperfabrik.cpp:

Koerper *Koerperfabrik::erzeugeKoerperteil(dWorldID welt) {
    Koerper *koerper = new Koerper ();
    koerper = erzeugeKoerper(welt);

    return koerper;
}

Schienbeinfabrik.cpp:

Koerper *Schienbeinfabrik :: erzeugeKoerper(dWorldID welt) {
    Koerper* schienbein = new Koerper ();
    (*schienbein).setRadius(0.2);
    (*schienbein).setLaenge(1.0);
    (*schienbein).setPosition(0, 0, 1.0);
    (*schienbein).erzeugeBody(welt);

    return schienbein;
}

模拟.cpp:

void erzeugeFussundSchienbein() {
    Koerperfabrik schienbeinfabrik = Schienbeinfabrik ();
    schienbein = schienbeinfabrik.erzeugeKoerperteil(world);
}

当我尝试访问 (*schienbein).getBody() 时,我收到错误“Speicherzugriffsfehler (Speicherabzug geschrieben)”,它转换为“段错误(核心已转储)”。

我希望有人能帮助我。

最佳答案

你有未定义的行为。

这个类有一个函数应该返回一些东西,但没有:

class Koerperfabrik {

public:
    Koerper *erzeugeKoerperteil(dWorldID welt);

protected:
    //    A return type                     no return value
    //      ~~~v~~~                                ~v~
    virtual Koerper* erzeugeKoerper(dWorldID welt) { };

};

你真的应该启用警告,因为你已经警告过你了。这是一个 godbolt example of the warning .在该示例中,我启用了 -Werror 以在出现警告时停止编译,但这是可选的。

我假设您想创建一个纯虚拟函数。


在 main 函数的代码中,您永远不会调用 Schienbeinfabrik:

//   You care creating a new Koerperfabrik
//         |        Here you copy a Schienbeinfabrik into it
//  v-------------v               ~~~~~~~~~v~~~~~~~~~ 
Koerperfabrik schienbeinfabrik = Schienbeinfabrik ();
schienbein = schienbeinfabrik.erzeugeKoerperteil(world);

变量 schienbeinfabrik 始终是 Koerperfabrik 类型,这不是您想要的。你应该这样做:

// construct a new Schienbeinfabrik
Schienbeinfabrik schienbeinfabrik;

// call something on it
schienbein = schienbeinfabrik.erzeugeKoerperteil(world);

对象在 C++ 中永远不会为 null,因此那里没有错误。工厂是使用默认构造函数隐式构造的。


最后,你有内存泄漏:

Koerper *Koerperfabrik::erzeugeKoerperteil(dWorldID welt) {
    Koerper *koerper = new Koerper (); // a new Koerper

    // You reassign the pointer, you loose
    // reference to the previous koerper
    koerper = erzeugeKoerper(welt);

    return koerper;
}

只需删除新的:

Koerper* koerper = erzeugeKoerper(welt);

关于c++ - 尝试实现工厂模式时如何修复 'Segmentation fault (core dumped)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594072/

相关文章:

c++ - 在 n-ary 树中创建/访问节点时内存泄漏

c++ - shared_ptr.get() 可以被多个线程调用,而另一个线程锁定并调用 shared_ptr.swap() 吗?

c++ - 将构建配置复制到发布配置 (Eclipse)

C# 类型对象指针

vba - 如何从另一个 Excel 实例引用工作簿

c++ - 指针数组中的值被覆盖

c++ - 在 C++ 中,加载是否可以在获取操作下方滑动/存储可以在释放上方 float 吗?

java - 需要在 Java 中将两个由英尺和英寸组成的对象添加在一起

连接两个字符数组 C

c - C 指针数组中的负索引