调用虚函数导致C ++中的Segmentation Fault

时间:2014-05-20 15:29:06

标签: c++ pointers segmentation-fault virtual-functions

我在使用C ++开发的简单数学分析工具时遇到问题 特别是程序在执行期间的某个点导致分段错误。这是一个
代码的简化版本:

#include <string>

using namespace std;

class Function 
{

string equation;

public: 
    Function(string equation) { this->equation = equation; }
    virtual string derivative() 
    { 
        // throws exception since it 
        // should never be invoked on Function 
    }
};

class Polynomial : public Function
{

public:
    Polynomial(string equation) : Function(equation);
    string derivative() { //compute the derivative }
};

class Exponential : public Function
{

public:
    Exponential(string equation) : Function(equation);
    string derivative() { //compute the derivative }
};

...

class Logarithmic : public Function
{

public:
    Logarithmic(string equation) : Function(equation);
    string derivative() { //compute the derivative }
};

int main(int argc, char * argv)
{
    string equation = argv;
    Function *f;
    if (//some condition)
        f = new Polynomial();
    else if (//some condition)
        f = new Exponential();
    ...

    else if (//some condition)
        f = new Logarithmic();

    string der = f->derivative();
}  

我的猜测是问题是由于指针*f在输出后失去指定值而引起的 if语句(通过将其初始化为Function *f = new Function();我得到了一个 异常而不是SegFault,意味着它调用父类中的方法 如果它有帮助,我在Ubuntu 13.10机器上的QT环境中工作 有人可以帮我解决这个问题或建议替代模式吗?谢谢

3 个答案:

答案 0 :(得分:1)

这:

Function *f;
if (//some condition)
    *f = new Polynomial();

可能导致崩溃。

应该是:

    f = new Polynomial();

答案 1 :(得分:1)

在我看来,你正在从if-else梯子的末端掉下来并在一个坏指针上调用derivative(),导致运行时SEGFAULT。添加退出时出现错误的最终else以验证此错误。

除此之外,您应该使用f = new Polynomial();等,正如其他人所说的那样。如果你的来源编译,我假设你真的是。

答案 2 :(得分:0)

Function *f;
if (//some condition)
    *f = new Polynomial();

至少应该发出警告,因为f(由解除引用运算符使用)未初始化,并且实际上应该是类型检查错误,因为new Polynomial()具有类型Function* -it是指针 - 但*f的类型为Function&。你的意思是

Function* f;
if (somecondition)
    f = new Polynomial();

请编译所有警告和调试信息,即g++ -Wall -Wextra -g。然后学习如何使用gdb调试器和valgrind内存泄漏检测器。