2011-07-28 25 views
2

私はObjective-Cのオブジェクトの保持と解放に慣れていますが、Audio Unitを通じてデータを処理しているので、Cレベルに留まり、iOSフレームワークを活用することはできません。この場合、私はオーディオデータを保持する構造体を持っており、一度にそれらの束を保持する必要があります。私が終わったら、私はその記憶を解放する必要があります。Cで構造体のメモリをどのように管理しますか?

私はCと構造体のメモリ管理規則に関する良いチュートリアルを探していましたが、まだ良いチュートリアルは見つかりませんでした。 (サンプルCコードはGoogleにとっては難しい)

データを適切にリリースできるようにCの構造をどのように管理すればよいですか?あなたはCの構造体を管理するための良いチュートリアルを知っていますか?

+0

ガベージコレクタがないので、Cとあまり関係ありません。もしあなたがヒープ(mallocなど)に何かを割り当てるならば、それを済ませたら 'free'する必要があります。 – GWW

+0

参照:http://stackoverflow.com/questions/5556125/using-functions-in-c-return-value – ninjalj

+0

最も簡単なのは、割り当てにポインタ(および 'malloc')を使用するのではなく、それらをローカル変数として割り当てることですスタック上にある。 –

答えて

4

割り当てがmallocで割り当て解除が自由で、常にペアになります。 多かれ少なかれ、自動解放なしでObjective-Cの世界として動作します。

+0

私の具体的な質問は、関数が私に構造体を与えるならばどうですか?私のコードがそれを解放するまで、それは記憶に残っていますか?それとも、structを自分の変数にmemcpyする必要がありますか? – Brennan

+0

@Brennan:それは関数に完全に依存しています。関数がヒープに構造体を割り当て、構造体ポインタを返す場合は、それを解放する責任があります。通常、関数のAPIドキュメントは、あなたがそれで何をする必要があるかを伝えます。 – GWW

+1

関数は、構造体へのポインタまたは構造体全体へのポインタを返すことができます。ポインタの場合は、mallocで割り当てられている可能性があります。その場合は、ポインタを解放する必要があります。小さなサンプル: typedef struct IntPair {int a、b; } IntPair f(){IntPair x; xを返します。 } //ヒープに割り当てられていないため、結果を削除する必要はありません。 IntPair * g(){IntPair * x = malloc(sizeof(IntPair)); xを返します。 } //リターン値を解放する必要があります。そうしないとリークします。 –

2

抽象データ型のチュートリアルを探します。ことhttp://en.wikipedia.org/wiki/Abstract_data_type

+0

ありがとう、私はあなたが推奨するページからリンクされたコードで非常に有用な例を見つけました。 http://en.wikipedia.org/wiki/Queue_(data_structure) – Brennan

1
#include <stdlib.h> 

struct st *x = malloc(sizeof *x); 

注: は、例えば、Wikipediaのページは、Cサンプルた

  • xは
  • ポインタでなければならないキャストが
  • 必要とされない
適切なヘッダを含みます

完了したら、freeに電話してください。

2

構造体の構成によっては、メモリの割り当てや割り当て解除を処理する関数を実際に作成したり、構造バッファーを処理するための不透明なデータ型として使用できるハンドルを与えることができます。たとえば、構造体に他のメモリバッファへのポインタが含まれている場合、構造体のバッファにはmallocfreeの呼び出しを単に組み合わせることはできません。配列全体をループし、構造体内のポインタを解放する必要があります最初に構造体を解放する前に、構造体内のポインタデータメンバのメモリリークを作成します。

だから、例えば、あなたが次のことを行うことができます:

typedef struct audio_struct 
{ 
    int array_size; 
    unsigned char* buffer; 
} audio_struct; 

typedef audio_struct* audio_handle; 

//this returns an allocated pointer to the caller. 
//caller takes ownership of the pointer. 
audio_handle alloc_audio_func(int buffer_size) 
{ 
    audio_handle temp; 
    temp = malloc(sizeof(audio_struct) * buffer_size); 

    return temp; 
} 

void fill_audio_arrays(audio_handle handle, int buffer_size) 
{ 
    for (int i=0; i < buffer_size; i++) 
    { 
     handle->buffer = malloc(SOME_SIZE); 
     handle->array_size = SOME_SIZE; 
    } 

    return; 
} 

//frees the buffer pointed to by the handle (i.e., pointer), and any associted 
//dynamic memory being pointed to by each structure's pointer-member 
//handle is invalid after function call (i.e., points to deallocated memory) 
void dealloc_audio_buffer(audio_handle handle, int buffer_size) 
{ 
    for (int i=0; i < buffer_size; i++) 
    { 
     free(handle->buffer); 
    } 

    free(handle); 

    return; 
} 

あなたはそれらの構造自体が追加含まれている場合は特に、常にforループ、あなたのバッファの構造要素を処理するために書く必要はありません。この方法であなたが処理しなければならない動的に割り当てられたメモリへのポインタ。

関連する問題