纯虚方法称为错误和崩溃

时间:2014-04-08 17:58:14

标签: c++ virtual

再次"纯虚拟方法称为错误",我检查了其他类似的问题,他们没有解决我的问题。 我提到的消息崩溃了。我不做任何花哨的员工。代码很大,所以只有重要的摘录:

class cCOLLECT_STR_NODES_HELPER
{
  protected:
    cCOLLECT_STR_NODES_HELPER( const std::string& searchStr,
                           const int attribute,
               const cGTI_SRCH_TREE_NAME_DLG *pDlg )
   : m_compareStr(searchStr), m_attr(attribute), pSrchDlg(pDlg) {}

    virtual ~cCOLLECT_STR_NODES_HELPER() {}

   public:
    virtual bool TreatTheNode( const cGTC_TREE_NODE *curNode ) = 0;
...
}

然后是派生类:

class cCOLLECT_STR_TOP_NODES_HELPER : public cCOLLECT_STR_NODES_HELPER
{
  public:
   cCOLLECT_STR_TOP_NODES_HELPER( const std::string& searchStr,
                               const int attribute,
                   const cGTI_SRCH_TREE_NAME_DLG *pDlg )
   : cCOLLECT_STR_NODES_HELPER( searchStr, attribute, pDlg ) {}

public:
virtual bool TreatTheNode( const cGTC_TREE_NODE *curNode );
...
}  

TreatTheNode()是单独实现的:

bool cCOLLECT_STR_TOP_NODES_HELPER::TreatTheNode( const cGTC_TREE_NODE *curNode ) {...

然后派生类初始化:

cCOLLECT_STR_NODES_HELPER *pHelper;

  cCOLLECT_STR_TOP_NODES_HELPER helper( searchStr, attribute, this );
  pHelper = &helper;

然后pHelper进入函数并在那里使用:

TraverseTreeNodes( const cGTC_TREE_NODE *curNode,
               cCOLLECT_STR_NODES_HELPER *pHelper ) const
{
if ( pHelper->TreatTheNode( curNode ) )  => CRASH

项目建成成功。怎么了?

2 个答案:

答案 0 :(得分:0)

在我发现我身边的错误并删除了问题后,我决定取消删除并部分回答。我相信其他人可以从这个愚蠢的错误中受益(当你有3个小时的截止日期时你会犯错误)。

我知道这很明显:实际上我写的代码是:

cCOLLECT_STR_TOP_NODES_HELPER helper( searchStr, attribute, this );
pHelper = &helper;

实际上是:

{
  cCOLLECT_STR_TOP_NODES_HELPER helper( searchStr, attribute, this );
  pHelper = &helper;
}

所以助手超出了范围...

问题是,我做了调试。 pHelper至少指向一些有意义的东西 这就是它的样子。我仍然不确定崩溃是怎么发生的,但是 原因很清楚。当指向的对象超出范围时,它可能是UB。 不过,如果有人描述了内部发生的事情,我会接受答案。

答案 1 :(得分:0)

在这种情况下,您面临一个空指针问题,因为您将未初始化的对象传递给参数,pHelper将没有值,因此将尝试使程序崩溃。