2015-04-17 104 views
0

我有这段代码,我正在创建一个SFML-Text对象。但是,当我尝试将这个函数放入函数时,我得到一个错误。我有一个Java编程背景,这个指针让我困惑。C++指针/对象错误

这是不正确使用指针/引用引起的问题,还是因为对象不能保持范围?或者是别的什么?

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. 

回答

2

第三个参数createDisplayText,即。 font,是(或“a”)问题。如果您在那里使用某种字体呼叫createDisplayText,它将被复制,该复制在该功能中使用,并在功能结束时再次删除。

但是在函数中,您可以调用text->setFont,这需要参考:它不会再次复制该参数,而是直接使用您的第一个副本。如前所述,这个第一个副本很快就会被删除。虽然这对text->setFont没有任何问题(因为如果createDisplayText结束,它也结束了),它将字体存储在Text类的某处以供以后使用。然后......

(参见setfont程序的文档也道:“font参数指的是字体
只要文本使用它必须存在。”)许多

一种解决方案:通(sf::Font &font而不是sf::Font font)的字体,并注意主体(等)中的字体将会存在直到它不再需要(很难说如何知道主要功能)。 PS:在Java中,所有东西都像一个指针一样工作。非指针的东西应该是真正令人困惑的部分...

1

这几乎是不可能找到上述代码中的bug。幸运的是,当你将它传递给主循环时,变量energyText超出了范围。

也许最好的是用GDB和Valgrind来运行它。

+0

有没有我可以提供的任何进一步的代码,澄清? – Einar

+0

@NaaiaiStudios与GDB和Valgrind一起运行。 – CyberGuy