从指针调用方法时出现分段错误

Segmentation fault while calling a method from a pointer

我正在尝试从 sf::RenderWindow 上的指针获取 window 大小,但是当我调用方法时 getSize() 它给我一个分段错误:

sf::RenderWindow* winHandle;

void createHandle(sf::RenderWindow *rw, {...}){
    winHandle = rw;
}

sf::Vector2i getWindowSize() const {
    return static_cast<sf::Vector2i>(winHandle->getSize());
}

createHandle 在这里就像一个构造函数,只是将 winHandle 的值设置为指向 RenderWindow 的指针。

更新: 经过一些研究和调试,我确定我的问题是因为 winHandle beeing null,但我仍然不明白为什么它会这样工作。

嗯,我有两个基础 类 UIHandle 和 UIElement,UIElement 继承 UIHandle 和任何其他 UI元素使用UI元素并释放它的功能。

喜欢:

class UIHandle {
   sf::RenderWindow* winHandle;
   void createHandle({...});
   {...}
};

class UIElement : public UIHandle {
   void setHandle(UIHandle handle);
   {...}
}

class anyOtherElement : public UIElement {
   {...}
}

(发布可能有问题) 每个元素都以相同的方式工作(这意味着它有句柄指针),但由于某些原因不是 UITitleBar

在 main() 中,我首先创建一个句柄,然后 link 这个句柄指向每个元素:

sl::UIHandle testHandle;
testHandle.createHandle(&window, sf::Vector2i(0, 0), sf::Vector2f(800, 600));
testHandle.e = &e;

sl::TestButton buttonA("Test", 20, 20, 100, 20);
buttonA.setHandle(&testHandle);

sl::UIButton buttonB("Test", 60, 60, 100, 20);
buttonB.setHandle(&testHandle);

sl::UITitleBar TitleBar("Test titlebar");
TitleBar.setHandle(&testHandle);

哦,好吧,即使指针不为空,它仍然无法按预期工作并导致与其他 UI 元素的段错误。

我的建议是在尝试访问指针的内容之前检查指针是否为NULL。 winHandle 可能为 NULL 或不是有效指针。很难知道您发布的代码的确切原因。

分段错误在很多情况下都会发生,如下所示。

  1. 当指针为NULL时
  2. 当您尝试更改只读内存的内容时
  3. 当您尝试使用悬挂指针时

您可以使用这个关于堆栈溢出的问题阅读更多关于分段错误的信息

What is a segmentation fault?