#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void make_teritory(void);
int main(void){
make_teritory();
return 0;
}
void make_teritory(void){
char *str;
// charサイズのメモリ領域を5つ作る
str = (char *)malloc(5 * sizeof(char));
//
memset(str, 'A', 5);
*(str+5) = '\0';
printf("%s\n", str);
}
上のプログラムのとき、strで取得したメモリ領域は解放する意味ありますか?
make_teritory関数を抜けたときに解放されるものだと思っているのですが、認識が間違っていたら教えてください。
メモリの解放ってする必要ありますか?
Re:メモリの解放ってする必要ありますか?
関数を抜けても、取得したメモリーは解放されません。
単にローカル変数として使いたいなら、配列を宣言した方良いですよ。
もしデバッガをお持ちなら、デバッグしてみてください。
只、上記のプログラムでは、関数を抜けた後にプログラムが終了しておりますので、
別に解放しなくても良いです。
単にローカル変数として使いたいなら、配列を宣言した方良いですよ。
もしデバッガをお持ちなら、デバッグしてみてください。
只、上記のプログラムでは、関数を抜けた後にプログラムが終了しておりますので、
別に解放しなくても良いです。
Re:メモリの解放ってする必要ありますか?
おはようございます。
プログラムの規模が大きくなってきますと、メモリ解放は必要不可欠になってきます。
特に、ゲームを作るときなんかはそうですね。
メモリ解放の意味があるか無いかと聞かれますと、「ある」ですね。
ただKorsakovさんもおっしゃるとおり、
提示されているプログラムでは、メモリ解放をしなくてもあまり差し支えはなさそうです。
mallocなどで動的に確保された領域は、プログラム終了と同時に解放されます。
malloc後に関数を抜け、すぐにプログラムを終了しているのでメモリに関する部分では問題は無いと思います。
普通に宣言された変数と、動的に確保された領域の違いは大丈夫でしょうかな?
普通に宣言された変数とは、
char *str; とか
int Value[2]; とかですね(本当は自動変数と言います)。
普通に宣言された変数は、ご存知のとおり関数内で宣言すれば関数を抜けるときに自動的に解放されます。
動的に領域を確保すれば、プログラマが明示的に解放しない限りどこで確保しても自動で解放されません。
(普通の変数でもstaticにすれば自動で解放されなくなったりしますが)
例外はいくつかあったりするんですが、基本はこのくらいの認識でいいのではと考えます。
プログラムの規模が大きくなってきますと、メモリ解放は必要不可欠になってきます。
特に、ゲームを作るときなんかはそうですね。
メモリ解放の意味があるか無いかと聞かれますと、「ある」ですね。
ただKorsakovさんもおっしゃるとおり、
提示されているプログラムでは、メモリ解放をしなくてもあまり差し支えはなさそうです。
mallocなどで動的に確保された領域は、プログラム終了と同時に解放されます。
malloc後に関数を抜け、すぐにプログラムを終了しているのでメモリに関する部分では問題は無いと思います。
普通に宣言された変数と、動的に確保された領域の違いは大丈夫でしょうかな?
普通に宣言された変数とは、
char *str; とか
int Value[2]; とかですね(本当は自動変数と言います)。
普通に宣言された変数は、ご存知のとおり関数内で宣言すれば関数を抜けるときに自動的に解放されます。
動的に領域を確保すれば、プログラマが明示的に解放しない限りどこで確保しても自動で解放されません。
(普通の変数でもstaticにすれば自動で解放されなくなったりしますが)
例外はいくつかあったりするんですが、基本はこのくらいの認識でいいのではと考えます。
Re:メモリの解放ってする必要ありますか?
メモリの開放は最終的にはOSが行ってくれるんでしたっけ?(ちょっとうる覚えなんで自信ないです
Javaでは自動でメモリを開放してくれるガーベージコレクションがありますが、
ちょっと私の勉強不足で、教えれるレベルにありません
メモリ4G、8G当たり前の時代ですから気にしなくていいかもしれないですが
私は自分で明示的に解放するようにしてます
スレッドにメモリを割り当てて何個もスレッドを生成、何個かスレッド終了して
なんかメモリが残ってるスレッドから、有効な値が変更される可能性などある場合があるんで
開放して、無効にしておきたいからです
例外が発生して止まりますから
まぁ、よほどのことでもやらない限りですが
Javaでは自動でメモリを開放してくれるガーベージコレクションがありますが、
ちょっと私の勉強不足で、教えれるレベルにありません
メモリ4G、8G当たり前の時代ですから気にしなくていいかもしれないですが
私は自分で明示的に解放するようにしてます
スレッドにメモリを割り当てて何個もスレッドを生成、何個かスレッド終了して
なんかメモリが残ってるスレッドから、有効な値が変更される可能性などある場合があるんで
開放して、無効にしておきたいからです
例外が発生して止まりますから
まぁ、よほどのことでもやらない限りですが
Re:メモリの解放ってする必要ありますか?
> メモリの解放ってする必要ありますか?
そう尋ねられれば、「必要あります」としか回答できません。
どのように振る舞うかを正確に把握できているのであれば、自分の責任において「解放しない」という選択をするのもよいでしょう。
> 上のプログラムのとき、strで取得したメモリ領域は解放する意味ありますか?
これに関しては、「意味がある」ということになります。
> dicさん
> メモリ4G、8G当たり前の時代ですから気にしなくていいかもしれないですが
処理系不明の状況で、そのような過程は無理があります。
アドレス空間が64Kバイト以下のコンピュータも、まだ普通に使われているのですから。
その意味で、OSの存在の有無も含めて、何一つ期待することはできません。
それに、PCだけを考えても、4G、8Gが当たり前というようなことはありません。
現在市販されている最新機種でも、1G程度のメモリしか搭載していないものが普通に存在しています。
そう尋ねられれば、「必要あります」としか回答できません。
どのように振る舞うかを正確に把握できているのであれば、自分の責任において「解放しない」という選択をするのもよいでしょう。
> 上のプログラムのとき、strで取得したメモリ領域は解放する意味ありますか?
これに関しては、「意味がある」ということになります。
> dicさん
> メモリ4G、8G当たり前の時代ですから気にしなくていいかもしれないですが
処理系不明の状況で、そのような過程は無理があります。
アドレス空間が64Kバイト以下のコンピュータも、まだ普通に使われているのですから。
その意味で、OSの存在の有無も含めて、何一つ期待することはできません。
それに、PCだけを考えても、4G、8Gが当たり前というようなことはありません。
現在市販されている最新機種でも、1G程度のメモリしか搭載していないものが普通に存在しています。