アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります

例えばある構造体を、

typedef struct {
 char* yoso1;
 int yoso2;
} kozotai;

とし、これをmallocで確保した後中身のポインタにもmallocし、

kozotai* test = (kozotai*)malloc(sizeof(kozotai));
test->yoso1 = (char*)malloc(128);

freeで開放すると、

free(test);

中の要素の指すメモリも開放されるでしょうか?
今はどちらか分からないので、
free(test->yoso1);free(test);としています。。。

A 回答 (4件)

malloc() の立場で考えると分かり易いと思います。



kozotai* test = (kozotai*)malloc(sizeof(kozotai));

としてますが、kouzoutai にキャストしているのはmalloc() の外であり、malloc() は自分が確保したメモリ領域の中に、ポインタがあって、そのポインタが指す領域がさらに malloc() されているなんて事は全く知りようがありません。ですから、全て free() するには、

free(test->yoso1);free(test);

とするのが正しいです。あるいは、kouzoutai_malloc() と kouzoutai_free() という関数を作り、その中で、上の処理をするという方がキレイかもしれません。

蛇足ですが、malloc() 時には領域の大きさを指定するのに、free() には大きさの指定がないのでしょう?ご存知かも知れませんが、malloc() が返すポインタのアドレスの前に、長さ等の情報が格納されているからで、free() はこの情報を使うので、常に malloc() した分だけを free() できるのです。

ここで敢えて free() の説明を取り上げたのは、C で標準的に使われる関数の大半は、C で簡単に書く事ができます。逆に言えば、それ以上の事をしないのは C のいいところであり悪いところなのかもしれません。

本の記述や仕様を鵜呑みにしないで、内部の処理がどうなっているのか考えてみると、理解もずいぶん深くなりますし、応用も効きます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
大変参考になりました。

お礼日時:2007/12/12 10:49

No.3さんについて少し細かいですがつっこみです。


>malloc() が返すポインタのアドレスの前に、
>長さ等の情報が格納されているからで

C言語で規定されているのはあくまでも、
malloc関数などを実装する処理系において、指定されたサイズの
オブジェクトを割り当てその先頭を返すこと。
生存期間が明示的に解放されるまで保持されること。
そして、割り当てられたオブジェクトの先頭から指定サイズの領域が
以降の割り当てで重複しないように割り当てること。
返却したオブジェクトの先頭をfree関数に渡した場合、
この指定された領域を解放し再度、割り当て可能な領域に
することなどです。

これらさえ守られていれば、どのようにその情報が管理されるかは、
環境に依存しているため、返却されたアドレスの前後に、
それらの情報が入っているかは、保障されていません。
    • good
    • 0

>中の要素の指すメモリも開放されるでしょうか?


char* 型の変数 yoso1 に malloc した領域へのアドレスが格納されていることを
知っているのはプログラマだけなので、自力で free(test->yoso1); して下さい。
    • good
    • 0

freeで解放されるのは渡したポインタが直接参照するメモリのみ。

その先の構造は考慮されない。端的に言ってmallocした単位でしか解放できないので、複合構造の場合は段階的に解放していく必要がある。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!