删除类名会导致分段错误



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

头文件

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;
}

胡乱猜测...由于您提供的代码没有任何问题...

  • 被调用的函数在基类中声明virtual,因此即使此处的声明中不存在 virtual 关键字,它也virtual

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

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

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

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

尽管正如 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 << "fnc1n";
  fnc2( var );
  var = -1;
  return var;
}
int DomainSolver::fnc2 (int& var)
{
  std::cout << "fnc2n";
  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;
}

假设这接近您的实际代码,那么您在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,您需要显示更多实际代码,因为没有足够的代码来正确诊断问题(返回值在那里,您显示的代码没有任何问题)。

相关内容

  • 没有找到相关文章

最新更新