C++ 从内存加载选定字体时,SFML 2.1 sf::Text.setString()会导致崩溃
如果我在字体上使用“loadFromFile()”,它将正确加载,游戏将运行。 但是,如果我在这里使用此示例代码:C++ 从内存加载选定字体时,SFML 2.1 sf::Text.setString()会导致崩溃,c++,codeblocks,sfml,C++,Codeblocks,Sfml,如果我在字体上使用“loadFromFile()”,它将正确加载,游戏将运行。 但是,如果我在这里使用此示例代码: sf::Font TempFont; //TempFont.loadFromMemory(&tempImageVec[0],lengthh); TempFont.loadFromFile("Arial.ttf"); WorldPointer->
sf::Font TempFont;
//TempFont.loadFromMemory(&tempImageVec[0],lengthh);
TempFont.loadFromFile("Arial.ttf");
WorldPointer->loadedFonts.push_back(TempFont);
//WorldPointer->loadedFonts[WorldPointer->loadedFonts.size()-1].loadFromMemory(&tempImageVec[0],lengthh);
WorldPointer->loadedFontNames.push_back("Arial");
它完全可以工作,字体可以绘制到游戏中,但是如果我这样做:
std::streampos lengthh;
std::ifstream file2("Arial.ttf", std::ios::in | std::ios::binary);
if(file2){
file2.seekg(0,std::ios::end);
lengthh = file2.tellg();
file2.seekg(0,std::ios::beg);
vector<char> tempImageVec(lengthh);
file2.read(&tempImageVec[0],lengthh);
sf::Font TempFont;
TempFont.loadFromMemory(&tempImageVec[0],lengthh);
WorldPointer->loadedFonts.push_back(TempFont);
WorldPointer->loadedFontNames.push_back("Arial");
}
可能是因为对象只存储指向数据的指针,而不进行深度复制吗?我想我刚读到流需要保持活动,这有点糟糕,我会尝试让流保持活动,我会回复你的哈哈:P@JoachimPileborg我想这是你说的是吗?不是流,但是从
tempImageVec
获取的指针必须在字体对象的生存期内有效。现在,当您离开if
主体时,tempImageVec
对象将被破坏,font对象中的指针将不再有效。是的,我保持了保存所有内存的向量处于活动状态,它现在似乎正在工作!但我从没想过会是这样,因为sf::Texture加载后不需要内存。。谢谢你们的快速帮助。
#0 0048DD0C tt_cmap4_char_map_binary () (??:??)
#1 004938E6 tt_cmap4_char_index () (??:??)
#2 0043C1A1 FT_Load_Char () (??:??)
#3 004128C2 sf::Font::loadGlyph(this=0x7069208, codePoint=32, characterSize=25, bold=false) (D:\developpement\sfml\sfml\src\SFML\Graphics\Font.cpp:388)
#4 0041233E sf::Font::getGlyph(this=0x7069208, codePoint=32, characterSize=25, bold=false) (D:\developpement\sfml\sfml\src\SFML\Graphics\Font.cpp:259)
#5 004146CC sf::Text::updateGeometry(this=0x28fdc4) (D:\developpement\sfml\sfml\src\SFML\Graphics\Text.cpp:248)
#6 00413F50 sf::Text::setString(this=0x28fdc4, string=...) (D:\developpement\sfml\sfml\src\SFML\Graphics\Text.cpp:68)
#7 00405656 world::world(this=0x28f2e8, MRP=0x28f100) (C:\Users\Heath\Desktop\Game Programming\Current Projects\Left4Zombie C++\world.cpp:11)
#8 004038A3 main() (C:\Users\Heath\Desktop\Game Programming\Current Projects\Left4Zombie C++\main.cpp:12)
(LoadGlyph is highlighted red)