Нарушение прав доступа при записи в переменные-указатели в динамически распределенных классах - PullRequest
0 голосов
/ 24 февраля 2011

Хорошо, название не очень хорошо объясняет мою ситуацию, поэтому я попытаюсь объяснить немного лучше здесь:

Вот часть моей структуры классов:

ObjectView (abstract class)

ShipView : ObjectView (child of object view)

В методе я создаю новый ShipView:

ShipView *shipview (in header file).

shipview = new ShipView(in main part of code).

Я тогда бегу shipview->Initialise(); настроить все в новом классе.

Но когда я получаю какие-либо строки кода, которые пытаются записать указатель, объявленный в классе ObjectView, это не позволяет мне сделать это и выдает мне сообщение о нарушении прав доступа. Сообщение, которое я получаю ниже:

"Unhandled exception at 0x00a0cf1c in AsteroidGame.exe: 0xC0000005: Access violation writing location 0xbaadf011."

Например, эта строка:

_ObjectData = new Model[mesh->mNumVertices];

выдаст мне ошибку.

Просто, к слову, я поместил это в заголовочный файл:

struct Model{
    GLfloat x,y,z;
    GLfloat nX,nY,nZ;
    GLfloat u,v;
};

Model *_ObjectData;

Однако, если бы я сделал что-то вроде

Model *_ObjectData = new Model[mesh->mNumVertices];

(объявлять и инициализировать все сразу)

это будет работать ....

Это похоже на то, что он не знает, что файл заголовка существует, или класс не был правильно создан, поэтому память не была распределена должным образом.

Любая помощь будет принята с благодарностью.

EDIT Заголовочный файл:

class ObjectView
{
public:
    ObjectView(void);
    virtual ~ObjectView(void);

    void Initialise(std::string objectpath, std::string texturepath);
    void InitialiseVBO(const aiScene* sc);  

    void RenderObject();

    virtual void ScaleObject() = 0;
    virtual void TranslateObject() = 0;
    virtual void RotateObject() = 0;

protected:
    struct Model{
        GLfloat x,y,z;
        GLfloat nX,nY,nZ;
        GLfloat u,v;
    };
    Model *_ObjectData;

    struct Indices{
        GLuint x,y,z;
    };
    Indices *_IndicesData;  

    TextureLoader _textureloader;
    GLuint _objectTexture;

    GLuint _objectVBO;
    GLuint _indicesVBO;

    int _numOfIndices;
};

Код:

void ObjectView::InitialiseVBO(const aiScene* sc)
{   
    const aiMesh* mesh = sc->mMeshes[0];

    _ObjectData = new Model[mesh->mNumVertices];

    for(unsigned int i = 0; i < mesh->mNumVertices; i++)
    {
        _ObjectData[i].x = mesh->mVertices[i].x;
        _ObjectData[i].y = mesh->mVertices[i].y;
        _ObjectData[i].z = mesh->mVertices[i].z;

        _ObjectData[i].nX = mesh->mNormals[i].x;
        _ObjectData[i].nY = mesh->mNormals[i].y;
        _ObjectData[i].nZ = mesh->mNormals[i].z;

        _ObjectData[i].u = mesh->mTextureCoords[0][i].x;
        _ObjectData[i].v = 1-mesh->mTextureCoords[0][i].y;
    }

    glGenBuffers(1, &_objectVBO);

    glBindBuffer(GL_ARRAY_BUFFER, _objectVBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(Model) * mesh->mNumVertices, &_ObjectData[0].x, GL_STATIC_DRAW);

    _IndicesData = new Indices[mesh->mNumFaces];

    for(unsigned int i = 0; i < mesh->mNumFaces; ++i)
    {
        for (unsigned int a = 0; a < 3; ++a)
        {
            unsigned int temp = mesh->mFaces[i].mIndices[a];
            if(a == 0)
                _IndicesData[i].x = temp;
            else if(a == 1)
                _IndicesData[i].y = temp;
            else
                _IndicesData[i].z = temp;
        }
    }

    glGenBuffers(1, &_indicesVBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indicesVBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices) * mesh->mNumFaces, _IndicesData, GL_STATIC_DRAW);

    _numOfIndices = sizeof(Indices) * mesh->mNumFaces;

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    delete _ObjectData;
    delete _IndicesData;
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

Если

_ObjectData = new Model[mesh->mNumVertices];

падает, в то время как

Model *_ObjectData = new Model[mesh->mNumVertices];

, это, безусловно, выглядит, как будто ваш объект не былinitialized.
Мой психический отладчик предполагает, что вы объявили другую переменную, также называемую shipview, то есть то, что вы называете Initialize() on.

0 голосов
/ 24 февраля 2011

0xbaadf011, вероятно, является смещением от 0xbaadf00d, который является шестнадцатеричным синонимом Bad Food.Это, безусловно, неинициализированный указатель.

Вы явно не устанавливаете свои указатели перед их использованием.Я предлагаю посмотреть на стек вызовов при его сбое, установить точку останова для одной из функций выше вашего сбоя, затем перезапустить программу и запускать ее построчно, пока не найдете указатель, установленный в 0xbaadf011 или 0xbaadf00d.Затем выясните, где вы должны были установить этот указатель.

...