【发布时间】:2016-02-02 17:48:22
【问题描述】:
我现在真的卡住了……
总结:
我的 C++ 应用程序每次都会崩溃
Access Violation Reading Error on location 0x000000008
使用多个对象指针向量肯定是错误的 使用 new 语句创建对象的位置。
-------------
我想通过使用 SDL2 创建一个简单的 GUI 引擎来训练我的技能 并设计成这样:
使用外部(全局)创建引擎类/对象
因为我想打包所有与引擎相关的东西,比如更新函数 在一个数据包中并通过 init 函数对其进行初始化:
使用 extern 创建 GUI 类/对象
我希望它也可以放在一个“包”中并在这个类中 我有多个 std::vector 要保留 我创建的窗口对象在全局堆上存活 临时创建它们是正确的还是有更好的 有什么方法吗?
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 创建方法是这样的:
图形界面
1>图形界面
2->GUIGadgetLable
3-->GUI文本
4--->ResourceTexture (createFromText)
2->图形界面
3-->ResourceTexture (createFromFile)
2->GUIGadgetButton
3-->GUI文本
在我将 ResourceManager 实施到胶囊之前,一切正常 SDL 纹理渲染功能,例如将位图从文件加载到 SDL_Texture 并从文本创建纹理。
资源管理器.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;
在我的代码中,所以我认为我的堆已损坏,但我不知道为什么在此之前所有使用相同方法的东西都运行良好?
资源管理器.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;
}
}
有人知道如何解决这个问题吗?
谢谢你:)
【问题讨论】:
-
“我会在几分钟内上传整个代码。”...请不要...即使现在是这样,您可能应该只将您的帖子编辑为一个问题并且只相关信息,否则以其当前的大小和蜿蜒的性质,很容易被标记为遗忘。让我们尝试一次处理一件事。或者,如果您让代码正常工作并且只想进行一般审查,请尝试使用方便命名的姊妹网站 Code Review。
-
是的,对不起,我做了一个小总结,这个问题似乎是由使用带有对象指针的向量和使用 new 创建对象引起的。但我找不到它尝试读取地址 0x0...8 的原因
-
使用 valgrind;如果失败,请使用调试器。
-
this->_resourceFonts.size()- 1请用_resourceFonts.back()替换这行和看起来像这样的行。 -
@kfx 我用 ollyDebug 对其进行了调试,并在程序检查变量在 EDX+8 位置是否为空但此时寄存器为空的命令中得到了我上面提到的错误产生访问冲突
标签: c++ oop pointers vector sdl-2