对象内部结构:解决分割错误问题

Structures within objects: solving segmentation fault issues

本文关键字:分割 错误 问题 解决 内部 结构 对象      更新时间:2023-10-16

当试图从类函数内访问类成员(这是一个结构)时,我遇到了分段错误的问题。我想我在某个地方说错了,但我看不出问题是什么。到目前为止,我已经尝试了很多不同的方法,但都没有成功。如有任何帮助,我将不胜感激。

program.h:

struct ButtonState {
  int analog_pin;
};
class LEDGarden {
 public:
  ButtonState *the_state;
  LEDGarden(void) {}
  void init(void);
  void initButtons(void);
};

program.cpp:

#include "program.h"
void LEDGarden::init(void) {
  ButtonState *the_state = new ButtonState();
  the_state->analog_pin = 5;
  initButtons();
}
void LEDGarden::initButtons(void) {
  // The problem happens here.
  the_state->analog_pin = 5;
}
int main() {
  LEDGarden garden;
  garden.init();
}

当我试图在函数initButtons的结构中进行分配时,会发生分割故障。我不知道是什么问题。

注意,当我使用gcc时,只要我不使用-O2标志,这个程序就可以正常工作。使用clang,不管编译标志是什么,我都会得到段错误。

您的LEDGarden有一个指向ButtonState的指针,您从未设置过。

init方法用相同名称的局部遮蔽成员变量(所以当你使用它时,成员变量不会被设置)。试着

void LEDGarden::init(void) {
  this->the_state = new ButtonState();
  the_state->analog_pin = 5;
  initButtons();
}

你应该做的可能是摆脱init(),并使其成为一个构造函数。

不同的行为可能取决于成员变量被设置为null或随机内存位置(可能是"好"或"坏",但永远不会是"正确";-)