再次"纯虚拟方法称为错误",我检查了其他类似的问题,他们没有解决我的问题。 我提到的消息崩溃了。我不做任何花哨的员工。代码很大,所以只有重要的摘录:
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
项目建成成功。怎么了?
答案 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将没有值,因此将尝试使程序崩溃。