我有这段代码,我在其中创建了一个 SFML-Text 对象。但是当我尝试将它放入一个函数中时,我得到了一个错误。我有 Java 编程背景,这个指针让我很困惑。
这是由于不正确使用指针/引用引起的问题,还是因为对象无法在范围内存活?或者,是其他原因吗?
void createDisplayText(sf::Text *text, string content, sf::Font font)
{
text->setFont(font);
text->setCharacterSize(24);
text->setString("Money: 0");
}
//Main function
sf::Text energyText;
createDisplayText(&energyText, "Energy: ", font);
energyText.move(0, 30);
//Main loop
window.draw(energyText);
我收到这个错误:
Unhandled exception at 0x0F58FE8C (sfml-graphics-d-2.dll) in SFML_testing.exe: 0xC0000005: Access violation reading location 0x0000000C.
最佳答案
createDisplayText
的第三个参数,即。 font
,是(或“一个”)问题。如果您用那里的某种字体调用 createDisplayText
,它会被复制,拷贝在函数内使用,并在函数结束时再次删除。
但在函数中,您调用了text->setFont
,它接受了一个reference:它不会再次复制参数,而是直接使用您的第一个拷贝。如前所述,第一个拷贝很快就会被删除。虽然这对 text->setFont
没有问题(因为如果 createDisplayText
结束,它也已结束),它会将字体存储在 Text 类中的某个位置以供以后使用。然后……
(也请参阅 setFont 的文档:“字体参数指的是字体
只要文本使用它就必须存在。")
许多解决方案中的一个:也为每个引用传递 createDisplayText
的字体(sf::Font &font
而不是 sf::Font font
) 并注意 main 中的字体(等)将一直存在,直到不再需要它为止(如果不知道 main 函数,很难说如何)。
PS:在 Java 中,一切都像指针一样。非指针的东西应该是真正令人困惑的部分......
关于C++ 指针/对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29709684/