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中,一切都像一个指针。非指针的东西应该才是真正令人困惑的部分...