EXC_BAD_ACCESS на iPhone (C ++) при доступе к переменной внутри метода - PullRequest
2 голосов
/ 18 мая 2011

Я делаю порт для j2me-игры на iPhone, используя C ++, и у меня странная проблема.Мои навыки C ++ не самые лучшие, я пришел из нескольких лет разработки Java, и я не касался 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-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.h

#include "defs.h"

#include "iGraphics.h"
#include "Image.h"

class Graphics 
{
public:
int test;

Graphics(void);

void setColor(int RGB);
void setColor(int red, int green, int blue);
void fillRect(int x, int y, int width, int height);

private:
Image* buffer;  
GLuint textureFrameBuffer;

};

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);
}

РЕДАКТИРОВАНИЕ:

Я не упомянул в оригинальном сообщении, что он вызывает вызов getGraphics () из GameCanvas, любой доступ к canvasGraphics внутри getGraphics дает EXC_BAD_ACCESS.Один пример, если я поместил эту строку после того, как этот объект Graphics был создан в конструкторе GameCanvas, он работает как положено:

canvasGraphics = new Graphics();
printf("canvasGraphics %i\n", canvasGraphics->test);

Но эта команда printf для метода getGraphics дает EXC_BAD_ACCESS.

Graphics* GameCanvas::getGraphics(void) 
{
    // Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
    printf("canvasGraphics %i\n", canvasGraphics->test);
    return canvasGraphics;
}

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Если у вас нет живого объекта Graphics (я предполагаю, что вы имеете в виду, что либо конструктор еще не был вызван, либо объект был разрушен во время вызова getGraphics ()), тогда вы ' Получите доступ к ненужной памяти, если вы пытаетесь сослаться на объект данных члена объекта canvasGraphics (например, canvasGraphics-> test). Так что это совершенно законное исключение.

Вы говорите, что пришли из мира Java, но это также будет недопустимо и в Java (за исключением того, что вы никогда не узнаете точное время жизни объекта в Java, поскольку вы полагаетесь на GC для уничтожения объекта).

0 голосов
/ 18 мая 2011

Ваша проблема может быть здесь:

buffer = Image::createImage(512, 512);

Я заметил, что вы не проверяете возвращаемое значение.Есть ли вероятность, что createImage вернет NULL?

...