Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当访问方法内部的变量时,在iPhone上执行坏访问(C+;+;) 我用C++制作了一个J2ME游戏的端口,我有一个奇怪的问题。我的C++技能不是最好的,我来自几年的java开发,我多年来一直没有接触C++。我的问题是,我有一个在构造函数上分配的类成员,但当我尝试在这个类的方法上访问这个变量时,我得到了EXC_BAD_访问权。我已经上网了,我找不到问题,我希望你能帮我解决这个问题。以下是代码的修改版本:_Iphone_C++_Exc Bad Access - Fatal编程技术网

当访问方法内部的变量时,在iPhone上执行坏访问(C+;+;) 我用C++制作了一个J2ME游戏的端口,我有一个奇怪的问题。我的C++技能不是最好的,我来自几年的java开发,我多年来一直没有接触C++。我的问题是,我有一个在构造函数上分配的类成员,但当我尝试在这个类的方法上访问这个变量时,我得到了EXC_BAD_访问权。我已经上网了,我找不到问题,我希望你能帮我解决这个问题。以下是代码的修改版本:

当访问方法内部的变量时,在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

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-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_访问权限。