C++ pointer/object 错误
C++ pointer/object error
我有这段代码,我在其中创建了一个 SFML-Text 对象。但是当我尝试将它放入一个函数中时,我得到了一个错误。我有 Java 的编程背景,这个指针的东西让我很困惑。
这是由于 pointers/reference 的不正确使用引起的问题,还是因为对象不在范围内?或者,是其他原因吗?
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.
要在上面的代码中找到错误几乎是不可能的。幸运的是,当您将变量 energyText
传递给主循环时,它超出了范围。
可能最好的办法是 运行 它与 GDB 和 Valgrind。
createDisplayText
的第三个参数,即。 font
,是(或"a")的问题。如果你在那里用某种字体调用 createDisplayText
,它会被复制,副本在函数内使用,并在函数结束时再次删除。
但是在函数中,你调用了text->setFont
,它接受了一个引用:它不会再次复制参数,而是直接使用你的第一个副本。如前所述,第一个副本很快就会被删除。虽然这对 text->setFont
没有问题(因为如果 createDisplayText
结束它也已经结束),它会将字体存储在文本 class 中的某处以供以后使用。然后...
(也请参阅 setFont 的文档:“字体参数指的是字体
只要文本使用它就必须存在。")
许多解决方案中的一个:也为每个引用传递 createDisplayText
的字体(sf::Font &font
而不是 sf::Font font
)并注意 main 中的字体(等)将继续存在直到不再需要它(在不知道主要功能的情况下很难说如何)。
PS:在Java中,一切都像一个指针。非指针的东西应该才是真正令人困惑的部分...
我有这段代码,我在其中创建了一个 SFML-Text 对象。但是当我尝试将它放入一个函数中时,我得到了一个错误。我有 Java 的编程背景,这个指针的东西让我很困惑。
这是由于 pointers/reference 的不正确使用引起的问题,还是因为对象不在范围内?或者,是其他原因吗?
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.
要在上面的代码中找到错误几乎是不可能的。幸运的是,当您将变量 energyText
传递给主循环时,它超出了范围。
可能最好的办法是 运行 它与 GDB 和 Valgrind。
createDisplayText
的第三个参数,即。 font
,是(或"a")的问题。如果你在那里用某种字体调用 createDisplayText
,它会被复制,副本在函数内使用,并在函数结束时再次删除。
但是在函数中,你调用了text->setFont
,它接受了一个引用:它不会再次复制参数,而是直接使用你的第一个副本。如前所述,第一个副本很快就会被删除。虽然这对 text->setFont
没有问题(因为如果 createDisplayText
结束它也已经结束),它会将字体存储在文本 class 中的某处以供以后使用。然后...
(也请参阅 setFont 的文档:“字体参数指的是字体
只要文本使用它就必须存在。")
许多解决方案中的一个:也为每个引用传递 createDisplayText
的字体(sf::Font &font
而不是 sf::Font font
)并注意 main 中的字体(等)将继续存在直到不再需要它(在不知道主要功能的情况下很难说如何)。
PS:在Java中,一切都像一个指针。非指针的东西应该才是真正令人困惑的部分...