目次 - API(機能別) - ファイル入出力 - SDL_AllocRW

# SDL_AllocRW

実装のない空のSDL_RWopsを確保する

## 構文

`SDL_RWops* SDL_AllocRW(void)`

## 戻り値

成功のとき確保したメモリへのポインタ, 失敗のときNULLを戻す. SDL_GetError()で詳細を知ることができる.

## サンプルコード

``

    #include "stdlib.h"
    #include "SDL.h"

    /* これらの関数はSDL_RWops内のポインタ以外で使ってはならない */
    static Sint64 mysizefunc(SDL_RWops * context)
    {
        return -1;
    }

    static Sint64 myseekfunc(SDL_RWops *context, Sint64 offset, int whence)
    {
        return SDL_SetError("この種類のSDL_RWopsはシークできない");
    }

    static size_t myreadfunc(SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
    {
        SDL_memset(ptr,0,size*maxnum);
        return maxnum;
    }

    static size_t mywritefunc(SDL_RWops *context, const void *ptr, size_t size, size_t num)
    {
        return num;
    }

    static int myclosefunc(SDL_RWops *context)
    {
        if(context->type != 0xdeadbeef)
        {
            return SDL_SetError("myclosefunc()で処理できない不正なSDL_RWops");
        }

        free(context->hidden.unknown.data1);
        SDL_FreeRW(context);
        return 0;
    }

    SDL_RWops *MyCustomRWop()
    {
        SDL_RWops *c=SDL_AllocRW();
        if(c==NULL) return NULL;

        c->size =mysizefunc;
        c->seek =myseekfunc;
        c->read =myreadfunc;
        c->write=mywritefunc;
        c->close=myclosefunc;
        c->type =0xdeadbeef;
        c->hidden.unknown.data1=malloc(256);
        return c;
    }

## 詳細

自分でSDL_RWopsの実装を提供するのでなければ, この関数を使う必要はない. 単に共通のデータ元の読込/書込を行うSDL_RWopsが必要なのであれば, SDL_RWFromFile()やSDL_RWFromMem()などのSDLに組み込まれた実装を使うべきである.

戻り値のポインタはSDL_FreeRW()で解放するべきである. あなたのプログラムが使うmalloc()/free()と, SDLが内部で使うmalloc()/free()は, OSやコンパイラによる違いがあるかもしれない. これらを混合して使うとセグメンテーション違反などのエラーを引き起こす可能性がある. SDL_RWopsはcloseメソッドが呼ばれたとき自分自身を解放しなければならない. 全てのSDL_RWopsはこの関数で確保するべきである. そうすれば, SDL_FreeRW()で正しく解放できる.

## 関連項目(関数)

SDL_FreeRW

## SDL Wikiへのリンク

SDL_AllocRW - SDL Wiki