我在使用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环境中工作
有人可以帮我解决这个问题或建议替代模式吗?谢谢
答案 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内存泄漏检测器。