删除类名会导致分段错误

时间:2014-02-09 04:02:33

标签: c++ class segmentation-fault

当我定义一个类的函数时,我会在其中调用同一个类的另一个函数。但是,当我不输入类名时,它会给出分段错误。检查下面。

标头文件

class DomainSolver
{
    int fnc1 (UserDefinedType & var);
    int fnc2 (UserDefinedType & var);
};

C档

int DomainSolver::fnc2 (UserDefinedType & var)
{
    return 0;
}

int DomainSolver::fnc1 (UserDefinedType & var)
{
    // fnc2 (var); // does not work
    DomainSolver::fnc2(var); // works

    return 0;
}

3 个答案:

答案 0 :(得分:2)

疯狂猜测...因为您提供的代码没有任何问题......

  • 被调用的函数在基类中声明为virtual,因此即使声明中没有virtual关键字,它也是virtual

  • 被调用的函数不会访问该对象的任何成员。

  • 您正在无效指针或引用上调用该函数(例如,通过空指针或已经删除的对象。

如果所有这些猜测都是正确的,则使用限定条件会禁止动态调度机制,从而避免取消引用指向vtable的无效指针。代码仍然是错误的(由于上面的第三点),但似乎有效。

解决方案不是通过无效指针或引用来调用成员函数。

答案 1 :(得分:0)

假设这接近您的实际代码,您在fnc1中有未定义的行为:

int DomainSolver::fnc1 (UserDefinedType & var)
{
    // fnc2 (var); // does not work
    DomainSolver::fnc2(var); // works
   // missing return!!!
}

您声明它返回int,但之后永远不会返回任何内容(在任何一种情况下)。两种情况都是UB,所以他们所做的任何事情在技术上都是“有效的”,因为你的代码不是。

此代码应为:

int DomainSolver::fnc1 (UserDefinedType & var)
{
    return fnc2 (var);
}

作为旁注:这是一个很好的例子,说明为什么你永远不应该忽略编译器给出的警告(因为你应该收到两个版本的警告)。

修改

使用您的最新修改为fnc1添加返回值,您需要显示更多实际代码,因为没有足够的可以正确诊断问题(返回值在那里,有{使用您显示的代码{3}}。

答案 2 :(得分:0)

虽然Zac的回复指出,你提出的功能没有正确形成,调用范围版本之间应该没有区别;如果你在一个案例中得到段错误而不是另一个案例,则可能是因为其他地方的代码。

这是一个很好的例子:

<强> dsolver.hh

#ifndef DSOLVER_HH
#define DSOLVER_HH

class DomainSolver
{
public:
  int fnc1 (int& var);
  int fnc2 (int& var);
};

#endif

<强> dsolver.cc

#include <iostream>
#include "dsolver.hh"

int DomainSolver::fnc1 (int& var)
{
  std::cout << "fnc1\n";
  fnc2( var );
  var = -1;
  return var;
}

int DomainSolver::fnc2 (int& var)
{
  std::cout << "fnc2\n";
  var = 100;
  return var;
}

<强> main.cc

#include <iostream>
#include "dsolver.hh"

int main()
{
  DomainSolver my_dsolver;
  int my_int = 5;
  my_dsolver.fnc1(my_int);
  return 0;
}