
お世話になります
例えばある構造体を、
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);としています。。。
No.3ベストアンサー
- 回答日時:
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 のいいところであり悪いところなのかもしれません。
本の記述や仕様を鵜呑みにしないで、内部の処理がどうなっているのか考えてみると、理解もずいぶん深くなりますし、応用も効きます。
No.4
- 回答日時:
No.3さんについて少し細かいですがつっこみです。
>malloc() が返すポインタのアドレスの前に、
>長さ等の情報が格納されているからで
C言語で規定されているのはあくまでも、
malloc関数などを実装する処理系において、指定されたサイズの
オブジェクトを割り当てその先頭を返すこと。
生存期間が明示的に解放されるまで保持されること。
そして、割り当てられたオブジェクトの先頭から指定サイズの領域が
以降の割り当てで重複しないように割り当てること。
返却したオブジェクトの先頭をfree関数に渡した場合、
この指定された領域を解放し再度、割り当て可能な領域に
することなどです。
これらさえ守られていれば、どのようにその情報が管理されるかは、
環境に依存しているため、返却されたアドレスの前後に、
それらの情報が入っているかは、保障されていません。
No.2
- 回答日時:
>中の要素の指すメモリも開放されるでしょうか?
char* 型の変数 yoso1 に malloc した領域へのアドレスが格納されていることを
知っているのはプログラマだけなので、自力で free(test->yoso1); して下さい。
No.1
- 回答日時:
freeで解放されるのは渡したポインタが直接参照するメモリのみ。
その先の構造は考慮されない。端的に言ってmallocした単位でしか解放できないので、複合構造の場合は段階的に解放していく必要がある。お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- Excel(エクセル) VBA ワークシート指定の1行目を選択をしたい 2 2022/08/20 18:10
- 英語 Since there is no change in external dimensions, t 1 2023/04/03 22:42
- 格安スマホ・SIMフリースマホ 楽天モバイル 間違って10分(標準)通話かけ放題 を選択しましたが キャンセルできる? 1 2022/06/27 23:39
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- サーバー Windowsサーバでグループを検索したい 1 2023/04/17 15:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体の配列について(2)
-
変数に文字列を代入する方法を...
-
領域の確保について
-
C++で、メンバもヒープに確保さ...
-
allocってなんですか?
-
指定したメモリアドレスの値の...
-
free関数で動作が止まる
-
mallocでメモリーを確保しよう...
-
入れ子になった構造体について
-
こんな画面構成にしたいのですが
-
freeで開放される範囲
-
メモリマップドファイルを可変...
-
配列の添え字の最大数とは?
-
c言語のポインタへの文字列入力...
-
win32APIのHeapAlloc()の使い方...
-
ヒープメモリの解放について
-
関数から配列を返すには?
-
VBAのプログラムで、DIAG = 1# ...
-
char型配列をint型に代入するには
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
malloc呼び出し時のセグメンテ...
-
入れ子になった構造体について
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
Win32APIでのメモリ管理について
-
配列の添え字の最大数とは?
-
C++のnewで確保したメモリーの...
-
プログラムが途中で強制終了し...
-
C言語 mallocとfreeについて
-
win32APIのHeapAlloc()の使い方...
-
LoadLibraryでAccess Violation...
-
グローバル変数のサイズ
-
MFCのCStringについて
-
メモリ不足になってしまう。
-
ヒープの実際の限界値は?
おすすめ情報