在基类崩溃中调用虚函数

时间:2014-03-07 13:28:36

标签: c++ boost recursion polymorphism

我在公共递归中调用受保护的虚函数时遇到问题。

我想要的是一个 Base 类,它调用递归函数 getAllStrings() ,然后调用 虚拟getString() 在其“子”列表的所有项目上运行 getString() 方法仅在其某些子类中实现。

// Base.hpp

class Base
{
private:
    // SharedBase is a typedef boost::shared_ptr<Base>
    std::list<SharedBase> baseList;

protected:
    virtual std::string getString() const
    {
        return "";
    };

public:
    Base(){}
    virtual ~Base(){}

    void addElmtToList(SharedBase sb)
    {
        baseList.push_back(sb);
    }

    // recursive
    void getAllStrings(std::string &returnedString)
    {
        if (!baseList.empty())
        {
            // Iterate through all children
            std::list<SharedBase>::iterator itBase = baseList.begin();
            while (itBase != baseList.end())
            {
                (*itBase)->getAllStrings(returnedString);
                ++itBase;
            }
        }

        returnedString += getString(); // ERROR !
    }

};

// Derived_a.hpp

class Derived_a : public Base
{
public:
    Derived_a();
    virtual ~Derived_a();

protected:
    std::string getString() const
    {
        return "derived_a string";
    }
};

// Derived_b.hpp

class Derived_b : public Base
{
public:
    Derived_b();
    virtual ~Derived_b();
};

基本上应用程序调用 getAllStrings() ,除了调用 getString() ,这会使应用程序崩溃。

简单地调用 getString() 函数而没有任何递归(注释 if 块)会导致应用程序崩溃。

将它设置为非虚拟使其工作,但在这种情况下该功能是无用的,所以我有点迷失。为什么会崩溃?

编辑10/03:添加了SSCCE here。基于Synxis代码。在Boost链接的计算机上运行。所以我想它确实与我们的应用程序环境有关。

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。

我跟DrMinGW做了一个跟踪,显示在ntdll.dll!RtlUlonglongByteSwap

中的segfaulting之前调用了一个信号

但是,该功能没有使用任何信号。

这是罪魁祸首:

//在“base.hpp”文件中

protected:

    /// Some useful type definition for the signal to emit when the
    /// configuration changes.
    typedef boost::signals2::signal<void ()> OnConfigurationUpdated;

    virtual std::string getString()
    {
       return "";
    }

public:
    /// Signal that subscribers have to connect to if they want to be alerted
    /// about the configuration changes.
    OnConfigurationUpdated reactOnChanges;

项目使用另一个项目序列化,从中导入类。但是,此项目未使用GUI重建。从Serialization项目中正确清理(删除.o和.dll文件)使其正常工作。