从指针调用方法时出现分段错误
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 或不是有效指针。很难知道您发布的代码的确切原因。
分段错误在很多情况下都会发生,如下所示。
- 当指针为NULL时
- 当您尝试更改只读内存的内容时
- 当您尝试使用悬挂指针时
您可以使用这个关于堆栈溢出的问题阅读更多关于分段错误的信息
What is a segmentation fault?
我正在尝试从 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 或不是有效指针。很难知道您发布的代码的确切原因。
分段错误在很多情况下都会发生,如下所示。
- 当指针为NULL时
- 当您尝试更改只读内存的内容时
- 当您尝试使用悬挂指针时
您可以使用这个关于堆栈溢出的问题阅读更多关于分段错误的信息
What is a segmentation fault?