我无法理解为什么它会以段故障错误的方式崩溃,我假设它返回的是无效指针@operatingtrialClass(nullptr)->sum(;谁能解释一下为什么?我认为它返回了一个无效的指针@operatingtrialClass(nullptr)->sum();谁能解释一下为什么?
#include <iostream>
class trialClass{
public:
trialClass () = default;
~trialClass ();
virtual int sum () = 0;
virtual int mul () = 0;
};
class secondtrial{
public:
static trialClass * operatingtrialClass (trialClass * l_trialClass)
{
trialClass * m_trialClass;
if (l_trialClass != nullptr)
m_trialClass = l_trialClass;
return m_trialClass;
}
static int sum ()
{
int a = 2;
int b = 3;
int sum = a + b;
/*Crash point*/
return operatingtrialClass(nullptr)->sum();
}
};
int main()
{
//trialClass * p_trialClass;enter code here
secondtrial * sec = new secondtrial;
//secondtrial::operatingtrialClass(reinterpret_cast<trialClass*>(sec));
std::cout<<sec->sum()<<std::endl;
}
在
static trialClass * operatingtrialClass (trialClass * l_trialClass)
{
trialClass * m_trialClass;
if (l_trialClass != nullptr)
m_trialClass = l_trialClass;
return m_trialClass;
}
trialClass * m_trialClass;
分数 m_trialClass
毫无用处,也不安全。如果 l_trialClass
是一个 nullptr
它就是这样的。m_trialClass
在没有指向安全的东西的情况下被退回,使 operatingtrialClass(nullptr)->sum();
在
static int sum ()
{
int a = 2;
int b = 3;
int sum = a + b;
/*Crash point*/
return operatingtrialClass(nullptr)->sum();
}
在狂野和古怪的世界里的冒险。未定义行为(UB) 因为我们不知道返回的指针指向哪里。在UB-land中,任何事情都可能发生,在这种情况下,任何事情都可能是崩溃。它可以很容易地不崩溃,并产生一个愚弄你的结果,让你以为程序是正确的。讨厌的东西,UB。
如何最好的解决这个问题,完全取决于你想让程序做什么。你可以
static trialClass * operatingtrialClass (trialClass * l_trialClass)
{
static trialClass defaultTC; // a generic and safe trialClass
static trialClass * m_trialClass = &defaultTC; // point at the safe trialClass
// note the use of static to allow m_trialClass
// to persist across multiple calls.
// it's pretty much useless if it gets
// recreated every time.
if (l_trialClass != nullptr)
m_trialClass = l_trialClass;
return m_trialClass;
}
以便你总是有一个安全的TrialClass,但这可能不是你未指定用例的正确选项。
侧面说明。secondtrial
不包含 状况. 如果没有国家,你可以省去自己的工作,并做出一个 namespace
.