在尝试针对堆损坏错误调试程序时,我决定在建议in this stack overflow post的Windows调试工具包中使用gflags。但是,当我尝试使用此工具并通过执行gflags -p /enable <program name> /full
启用整页堆检查时
(程序名称是我的程序路径),我使用的库之一SDL_ttf抛出一个异常,说明在Jetfuel图形示例中,在0x6CD3D0FC(libfreetype-6.dll)处抛出了一些异常。 exe:0xC0000005:访问冲突读取位置0x0A02A000&#34;在函数TTF_OpenFont与有效参数一起使用之后。这是否意味着我的SDL_TTF版本导致我的堆损坏错误,或者这是否意味着我的代码出错?
这是我的代码(当我测试它时,我将文件名设置为&#34; default.ttf&#34;,没有面部索引,字体大小设置为20):
#include "font.h"
namespace jetfuel {
namespace draw {
bool Font::m_ttfinit = false;
Font::Font(const std::string filename) {
m_filename = filename;
m_isfontloaded = true;
}
Font::Font(const std::string filename, const long faceindex) {
m_filename = filename;
m_faceindex = faceindex;
m_isfontloaded = true;
}
void Font::Load_font(const std::string filename){
Set_file_name(filename);
Set_is_font_loaded(true);
}
void Font::Load_font(const std::string filename, const long faceindex){
Set_file_name(filename);
Set_face_index(faceindex);
Set_is_font_loaded(true);
}
void Font::Change_size(const unsigned int size){
// Open Font with font index if index is set.
if (!Get_ttf_init()) {
if (TTF_Init() != 0) {
std::cerr << "SDL TTF ERROR:" << TTF_GetError() << "\n";
throw exceptions::SDL_ttf_exception();
}
Set_ttf_init(true);
}
if(Get_file_name()!=""){
if (Get_ttf_font() != nullptr) {
TTF_CloseFont(Get_ttf_font());
}
std::string filename = Get_file_name();
char *filenamecstring = new char[filename.length()+1];
TTF_Font *ttffont;
strcpy(filenamecstring, filename.c_str());
SDL_ClearError();
if(Get_face_index()!=-1){
ttffont = TTF_OpenFontIndex(filenamecstring, size,
Get_face_index()); // And also can happen here!!
}else{
ttffont = TTF_OpenFont(filenamecstring, size); // Error happens here!!
}
Set_ttf_font(ttffont);
if(Get_ttf_font()==nullptr){
std::cerr << "SDL TTF ERROR:" << TTF_GetError() << "\n";
throw exceptions::SDL_ttf_exception();
}
}
}
} /* namespace draw */
} /* namespace jetfuel */
以下是库和我的操作系统的版本: