1

callocshared_ptrを介してメソッドで以前に割り当てたデータにアクセスしようとしています。何らかの理由で、(コードスニペットの最後の行EXC_BAD_ACCESS)でアクセスできません(でクラッシュし続けます)。glTexImage2D

データをロードするための私のutilメソッド:

shared_ptr<ImageData> IOSFileSystem::loadImageFile(string path) const
{
    // Result
    shared_ptr<ImageData> result = shared_ptr<ImageData>();

    ...

    // Check if file exists
    if([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:NO])
    {
        ...

        GLubyte *spriteData = (GLubyte*) calloc(width * height * 4, sizeof(GLubyte));

        ...

        // Put result in shared ptr
        shared_ptr<GLubyte> spriteDataPtr = shared_ptr<GLubyte>(spriteData);
        result = shared_ptr<ImageData>(new ImageData(path, width, height, spriteDataPtr));
    }
    else
    {
        cout << "IOSFileSystem::loadImageFile -> File does not exist at path.\nPath: " + path;
        exit(1);
    }

    return result;
}

のヘッダーImageData

class ImageData
{
public:
    ImageData(string path, int width, int height, shared_ptr<GLubyte> data);
    ~ImageData();

    string getPath() const;

    int getWidth() const;
    int getHeight() const;

    shared_ptr<GLubyte> getData() const;

private:
    string path;

    int width;
    int height;

    shared_ptr<GLubyte> data;
};

utilクラスを呼び出すファイル:

void TextureMaterial::load()
{
    shared_ptr<IFileSystem> fileSystem = ServiceLocator::getFileSystem();
    shared_ptr<ImageData> imageData = fileSystem->loadImageFile(path);

    this->bind(imageData);
}



void TextureMaterial::bind(shared_ptr<ImageData> data)
{
    // Pointer to pixel data
    shared_ptr<GLubyte> pixelData = data->getData();

    ...

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->getWidth(), data->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixelData);
}

念のために言っておきますが、shared_ptrをすべて破棄すると、データにアクセスできます。の署名glTexImage2D

void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data);

追加の質問:通常はfree(spriteData)する必要がありますが、shared_ptrにデータを渡したので、shared_ptrが削除されると、データは解放されますか?

4

2 に答える 2

4

shared_ptr魔法のようにメモリを解放する方法を推測することはできません。デフォルトではそれを試みますdelete、そしてあなたが使用しなかったのでnew、それは惨事に終わります。

あなたはそれを行う方法をそれに教える必要があります:

shared_ptr<GLubyte>(spriteData, &std::free);
于 2012-08-02T12:12:25.273 に答える
3

これがあなたの問題だと思います:

..., &pixelData);

ポインタを取得する代わりに、shared_ptr<GLubyte>サイレントにキャストされるローカル変数(型)のアドレスを取得しています。void*次のように置き換えます。

..., pixelData.get());
于 2012-08-02T12:17:58.590 に答える