成功的取消引用似乎会导致潜在的段错误

Posted

技术标签:

【中文标题】成功的取消引用似乎会导致潜在的段错误【英文标题】:Successful dereference seems to cause a latent segfault 【发布时间】:2020-12-21 04:34:29 【问题描述】:

如标题中所述,我已成功取消引用进出 modMYSTRUCTshowMeThis 函数的数据。显示“Fourth check”之前的正确输出,但出现段错误:

First check
Second check
0
Third check
Segmentation fault (core dumped)

但是,当我从(cout << "First check\n";cout << "Third check\n";)或从(MYSTRUCT struct_inst;cout << "Fourth check\n";)发表评论时,这不会发生。当我这样做时,代码会为未注释的代码生成预期的输出。

上述产生段错误的代码:

struct MYSTRUCT

  int * num;
;

void modMYSTRUCT( MYSTRUCT * struct_inst )

  cout << *(struct_inst->num) << endl;
  *(struct_inst->num) = 2;


int showMeThis( int * x )

  return *x;


int main()

  cout << "First check\n";
  int x[1][1] =  0 ;
  cout << "Second check\n";
  cout << showMeThis(&(**x)) << endl;
  cout << "Third check\n";


  MYSTRUCT struct_inst;
  *(struct_inst.num) = 1;
  modMYSTRUCT(&struct_inst);

  cout << *(struct_inst.num) << endl;
  cout << "Fourth check\n";

我在这里一无所知。对于上下文,我正在寻找一种更好的方法来取消引用 GLM 矩阵。有什么想法吗?

【问题讨论】:

您是否尝试过单步调试器? struct_inst.num 从未初始化,因此您的程序具有未定义的行为。这意味着它可能会起作用,或者可能会不一致地起作用,或者可能根本不起作用。 你能解释一下这段代码应该完成什么吗?这是一个玩具示例,但玩具的目标是什么?从高层次开始,逐步深入了解更多细节,以及explain to your rubber duck 为什么您的代码中不会出现错误。一定要想象你的鸭子在每次解释后都怀疑地看着你。 ;) 刚才和常规编译不同的是,它在从cout &lt;&lt; "First check\n";cout &lt;&lt; "Third check\n"; 的评论时产生了段错误。 @JaMiT 这是一个从双缓冲数组传递单个元素地址的实验(我现在也知道,&amp;(**x) 有点多余,除非我指的是任何一个元素除了数组的每个维度的第一个之外的索引)。幸运的是,调试器和@1201ProgramAlarm 让我想到了struct_inst.num 的初始化。我现在看到我正在为未分配的内存区域分配一个值。为什么这始终以前面描述的方式导致段错误? ¯\_(-_-)_/¯ ...就像@1201ProgramAlarm 所说,“不一致”。 【参考方案1】:

用这个替换你的MYSTRUCT

struct MYSTRUCT

  int * num;                    
  MYSTRUCT() num = new int;   // allocate memory for an integer
  ~MYSTRUCT() delete num;     // free memory (will be called when struct_inst goes out of scope)
;

但老实说,仅仅因为你能做到这一点,并不意味着你应该这样做。 :)

【讨论】:

那么,这有什么问题呢?如果上下文超出了声明 struct_inst 的函数的范围,那么删除它是正常的,对吧? 这样就行了。我猜另一种选择是指向以前分配的 int 或使用 malloc()。 抱歉,我现在看到了它的问题。超出范围的函数仍然可以尝试通过引用来访问它。如果我能编辑我的评论就好了。 @Texedo,我之所以说你不应该是因为没有真正的理由在那里使用指向整数的指针,而不仅仅是一个简单的int num。另外,对于您的具体示例,当struct_inst 超出范围时,指向整数的指针被清除,但整数不是,所以这是内存泄漏。 指向 int(s) 的指针的目的是模拟 GLM mat4 类型,据我了解,它充当二维浮点数组。这是一个模拟 mat4 的实验,旨在找到一种更好的语法来传递矩阵的第一个元素的地址。我只是碰巧掩盖了第一个元素的劣质分配(或缺少)。

以上是关于成功的取消引用似乎会导致潜在的段错误的主要内容,如果未能解决你的问题,请参考以下文章

QOpenGLVertexArrayObject 导致多个 VBO 的段错误?

perlbench 导致 SPEC 2006 线束之外的段错误

OpenCV 分配导致 std::thread::join 中的段错误

Struct 上下文中未使用 printf 时的段错误

文件读取期间的段错误

c ++ memset导致int**指针的段错误