我现在真的卡住了......
要点:
我的C ++应用程序每次都以
崩溃Access Violation Reading Error on location 0x000000008
通过使用多个对象指针向量必须是错误 使用新语句创建对象的位置。
-------------
我想通过使用SDL2创建一个简单的GUI引擎来培养我的技能 并设计如下:
使用extern(全局)
创建Engine类/对象因为我想打包所有引擎相关的东西,比如更新功能 在一个数据包中并通过init函数初始化:
使用extern
创建GUI类/对象我希望这也可以在一个“包”中并且在这个类中 我有多个std :: vector<#PointerToObject#>保持 我创建的窗口对象在全局堆上生效 暂时创建它们是正确的还是更好的 这样做的方法?
GUI.h
//...
class GUIWindow
{
//...
std::vector< GUIGadgetLable* > _guiGadgetLables;
std::vector< GUIGadgetButton* > _guiGadgetButtons;
//...
};
class GUI
{
//...
std::vector< GUIWindow* > _guiWindows;
//...
void createWindow(std::string title, int x, int y, int sx, int sy);
};
//...
extern GUI engineGUI;
GUI.cpp
//...
void GUI::createWindow(std::string title, int x, int y, int sx, int sy)
{
this->_guiWindows.insert(this->_guiWindows.end(), new GUIWindow(title,x,y,sx,sy));
return this->_guiWindows.at(this->_guiWindows.size()-1);
}
//...
GUI engineGUI;
我在很多对象中执行此操作,而我创建GUI的hirachy是这样的:
GUI
1&GT; GUIWindow
2→GUIGadgetLable
3 - &GT; GUIText
4 ---&gt; ResourceTexture(createFromText)
2→GUIImage
3 - &gt; ResourceTexture(createFromFile)
2→GUIGadgetButton
3 - &GT; GUIText
一切正常,直到我将ResourceManager实现到胶囊 SDL纹理渲染功能,如将文件中的Bitmap加载到SDL_Texture中,并从文本中创建纹理。
ResourceManager.h
class ResourceFont
{
public:
TTF_Font* _font = NULL;
int _fontSize = 3;
std::string _fontFile = "";
bool loadFromFile(std::string file, int fSize);
void destroy();
};
class ResourceTexture
{
public:
SDL_Texture *_texture = NULL;
SDL_Rect _size;
SDL_Rect _position;
std::string _data = ""; //File/Text
bool _visible = true;
bool _isText = false;
int _fSize = 3;
SDL_Color _textColor = {70,30,120};
bool createFromFile(std::string file, int x, int y, float sx, float sy);
bool createFromText(std::string text, int fSize, int x, int y, SDL_Color foreGround);
bool changeText(std::string text);
void resize(float sx, float sy);
void update(int x, int y);
void draw();
void destroy();
};
class ResourceManager
{
public:
std::vector< ResourceFont* > _resourceFonts;
std::vector< ResourceTexture* > _resourceTextures;
TTF_Font* addFont(std::string fontFile, int fSize);
};
extern ResourceManager engineResource;
Texture完全有效,但是在ResourceFont * Vector和addFont函数(使用TTF_Font为ResourceTexture :: createFromText函数创建一个新的字体句柄)的实现之后,程序下面的程序崩溃并且访问违规读取在地址0x0 ... 08处,这是我打电话给
的地方new ResourceFont()
或
return this->_resourceFonts.at(i)->_font;
在我的代码中,所以我认为我的堆已损坏,但我不知道为什么如果使用相同方法的所有方法都运行良好,直到这一点?
ResourceManager.cpp
TTF_Font *ResourceManager::addFont(std::string fontFile, int fSize)
{
std::cout << "GOIN "<< fSize << std::endl;
if (this->_resourceFonts.size())
{
for (unsigned int i=0; i < this->_resourceFonts.size(); i++)
{
std::cout << "Compare: " << i << " Search: " << fSize << " Found: " << this->_resourceFonts.at(i)->_fontSize << std::endl;
if (this->_resourceFonts.at(i)->_fontSize==fSize) //this->_resourceFonts.at(i)->_fontFile==fontFile&&
{
//std::cout << this->_resourceFonts.at(i) << std::endl;
if (this->_resourceFonts.at(i)->_fontSize==fSize)
{
std::cout << "Found one " << &this->_resourceFonts.at(i)->_font << std::endl;
return this->_resourceFonts.at(i)->_font; //Crashes sometimes here were it try to acces the object
}
else
{
return 0;
}
}
std::cout << "Nope" << std::endl;
}
}
std::cout << "Create One" << std::endl << std::endl;
this->_resourceFonts.insert(this->_resourceFonts.end(), new ResourceFont()); //Crashes sometimes here
this->_resourceFonts.at(this->_resourceFonts.size()- 1)->loadFromFile(fontFile,fSize);
if (this->_resourceFonts.at(this->_resourceFonts.size()-1)->_font)
{
return this->_resourceFonts.at(this->_resourceFonts.size()- 1)->_font;
}
else
{
this->_resourceFonts.at(this->_resourceFonts.size()- 1)->destroy();
return NULL;
}
}
有人知道如何解决这个问题吗?
谢谢:)
答案 0 :(得分:1)
不知道这是否是真正的错误,但代码太大而无法容纳评论。
在AddFont
的最后,你有:
if (this->_resourceFonts.at(this->_resourceFonts.size()-1)->_font)
{
return this->_resourceFonts.at(this->_resourceFonts.size()- 1)->_font;
}
else
{
this->_resourceFonts.at(this->_resourceFonts.size()- 1)->destroy();
return NULL;
}
此代码测试非空_font
,这意味着在else
部分_font
成员 为空。它仍然留在_resourceFonts
向量中。
答案 1 :(得分:1)
看起来我找到了问题:
如果我在每个函数中直接使用ResoruceManager :: addFont()而不是将其保存在额外的TTF_Font * var中,则程序运行正常。