当访问方法内部的变量时,在iPhone上执行坏访问(C+;+;) 我用C++制作了一个J2ME游戏的端口,我有一个奇怪的问题。我的C++技能不是最好的,我来自几年的java开发,我多年来一直没有接触C++。我的问题是,我有一个在构造函数上分配的类成员,但当我尝试在这个类的方法上访问这个变量时,我得到了EXC_BAD_访问权。我已经上网了,我找不到问题,我希望你能帮我解决这个问题。以下是代码的修改版本:
GameCanvas.h当访问方法内部的变量时,在iPhone上执行坏访问(C+;+;) 我用C++制作了一个J2ME游戏的端口,我有一个奇怪的问题。我的C++技能不是最好的,我来自几年的java开发,我多年来一直没有接触C++。我的问题是,我有一个在构造函数上分配的类成员,但当我尝试在这个类的方法上访问这个变量时,我得到了EXC_BAD_访问权。我已经上网了,我找不到问题,我希望你能帮我解决这个问题。以下是代码的修改版本:,iphone,c++,exc-bad-access,Iphone,C++,Exc Bad Access,GameCanvas.h #include "Graphics.h" #include "defs.h" class GameCanvas { Graphics* canvasGraphics; public: GameCanvas(void); Graphics* getGraphics(void); }; GameCanvas.cpp #include <stdio.h> #include "GameCanvas.h" #include "Wrap-C-Inte
#include "Graphics.h"
#include "defs.h"
class GameCanvas {
Graphics* canvasGraphics;
public:
GameCanvas(void);
Graphics* getGraphics(void);
};
GameCanvas.cpp
#include <stdio.h>
#include "GameCanvas.h"
#include "Wrap-C-Interface.h"
GameCanvas::GameCanvas(void)
{
canvasGraphics = new Graphics();
// Sets up matrices and transforms for OpenGL ES
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, 320.0f, 480.0f);
glOrthof(0.0f, 320.0f,
480.0f, 0.0f,
-1.0f, 1.0f);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glOrthof(0.0f, 512.0f*2,
0.0f, 512.0f*2,
-1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
// Clears the view with black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Enable use of the texture
glEnable(GL_TEXTURE_2D);
// Set a blending function to use
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Enable blending
glEnable(GL_BLEND);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
}
Graphics* GameCanvas::getGraphics(void)
{
// Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
return canvasGraphics;
}
Graphics.cpp
#include "Graphics.h"
#include "Wrap-C-Interface.h"
Graphics::Graphics(void)
{
test = 314;
buffer = Image::createImage(512, 512);
// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, buffer->tex2d->texture, 0);
// restore frame buffer
restoreFrameBuffer();
};
void Graphics::setColor(int red, int green, int blue)
{
glColor4ub(red, green, blue, 255);
}
void Graphics::setColor(int RGB)
{
glColor4ub(RGB>>16&0xff, RGB>>8&0xff, RGB&0xff, 255);
}
void Graphics::fillRect(int x, int y, int width, int height)
{
GLshort vertices[] = {
x, y,
x + width, y,
x, y + height,
x + width, y + height,
};
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_SHORT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// restore default state
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
}
编辑:
我在最初的帖子中并没有提到它挂起调用GameCanvas的getGraphics(),任何对getGraphics内部的canvasGraphics的访问都会导致EXC_BAD_访问。例如,如果我在GameCanvas构造函数上实例化此图形对象后放置这一行,它将按预期工作:
canvasGraphics = new Graphics();
printf("canvasGraphics %i\n", canvasGraphics->test);
但是getGraphics方法上的printf命令提供了EXC\u BAD\u访问
Graphics* GameCanvas::getGraphics(void)
{
// Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
printf("canvasGraphics %i\n", canvasGraphics->test);
return canvasGraphics;
}
你的问题可能在这里:
buffer = Image::createImage(512, 512);
我注意到您没有检查返回值。
createImage
是否有可能返回NULL
?您的问题可能在这里:
buffer = Image::createImage(512, 512);
我注意到您没有检查返回值。如果您没有实时图形对象,是否有可能
createImage
返回NULL
?如果您没有实时图形对象(我假设您的意思是,在调用此getGraphics()时,构造函数尚未调用,或者对象已被销毁),如果您试图引用canvasGraphics对象的成员数据对象(如canvasGraphics->test),则您正在访问垃圾内存。所以这是一个完全合法的例外
您说您来自java世界,但这在java中也是非法的(除非,您永远不知道java中对象的确切生存期,因为您依赖GC销毁对象)。如果您没有实时图形对象(我假设你的意思是,在调用这个getGraphics()时,构造函数还没有被调用,或者对象已经被销毁),那么如果你试图引用canvasGraphics对象的一个成员数据对象(比如canvasGraphics->test),那么你就是在访问垃圾内存。所以这是一个完全合法的例外
您说您来自java世界,但这在java中也是非法的(除了,您永远不知道java中对象的确切生存期,因为您依赖GC销毁对象).谢谢,但这不是问题所在,我删除了这一行,它挂起在同一点上,我没有在帖子中指明问题出在哪里,尽管有对代码的评论。它挂起调用getGraphics()对于GameCanvas,任何对getGraphics中的canvasGraphics的访问都会提供一个EXC_BAD_访问。谢谢,但这不是问题,我删除了这一行,它挂起在同一点上,我没有在我的帖子中指定问题出在哪里,尽管有对代码的评论。它挂起调用getGraphics()对于GameCanvas,任何对getGraphics内canvasGraphics的访问都会提供一个EXC_BAD_访问权限。