TTF_OpenFont会导致窗口出现堆损坏警告

时间:2017-11-05 01:50:41

标签: c++ sdl heap-corruption sdl-ttf

在尝试针对堆损坏错误调试程序时,我决定在建议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 */

以下是库和我的操作系统的版本:

  • Windows 8.1 64位
  • Visual Studio 2017社区
  • SDL 2.0.6
  • SDL_ttf 2.0.14

0 个答案:

没有答案