你好,其实我想了解下面的代码。谁能详细说明一下这段代码到底是做什么的.为什么在第31行的时候会崩溃呢?

问题描述 投票:-3回答:1

我无法理解为什么它会以段故障错误的方式崩溃,我假设它返回的是无效指针@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;
}
c++ c++11 pointers abstract-class
1个回答
0
投票

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.

© www.soinside.com 2019 - 2024. All rights reserved.