您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
Hello, I actually want to understand the following code. Can someone please elaborate the code what exactly it is doing. why is it crashing at line 31
我无法理解为什么它会因段错误而崩溃。我假设它返回了一个无效的指针 @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;
}
in
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土地上任何事情都可能发生,在这种情况下,任何事情都是崩溃。它可以很容易地不崩溃并产生一个结果,欺骗你认为程序是正确的。讨厌的东西,呃。
如何最好地解决这个问题完全取决于您希望程序做什么。你可以
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
.
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 0-1背包代码中的错误.我的代码中有什么错误
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 这行代码在C++类中意味着什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 此代码中的操作流程是什么?C/C++.
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 此代码验证公式是什么意思?
- 需要以下代码的帮助,下面的代码有什么问题
- C++标准提案代码:什么是 N 和 P?
- C - 哈希算法代码什么都没有返回
- 将"12345678"转换为"1-234-5678",我的代码什么也没产生
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- 有人能告诉我为什么这个代码什么都不打印吗