9月18日開催!現年収非公開で企業からスカウトをもらってみませんか?PR

転職ドラフトでリアルな市場価値を測る。レジュメをもとに、企業から年収とミッションが提示されます。

0
0

忘れがちなメモリの解放ケース

Posted at

CやC++をやっているのであれば誰しもが通るmalloc関数ですが、mallocにはfreeがつきものです。今回はあなたの身近でこんなメモリは解放し忘れていませんか?という例を紹介します!

ケース1

sample
char *p1 = (char *)malloc(sizeof(char)*10);
char *p2 = (char *)malloc(sizeof(char)*15);
p1 = p2;
free(p1);

これは今p1にp2を代入している状態です。一見よさそうにも見えますが、これはつまりp1宣言時に確保されたメモリが、誰からも刺されてないポインタの状態になっています。
こうなるとメモリは適切に解放されないため、リークエラーが発生します。

じゃあどうする?

上記のようなケースに当たることは少ないかもしれませんが、代入する前に一度他の変数に置くようにするなどが有効です。

sample
char *p1 = (char *)malloc(sizeof(char)*10);
char *p2 = (char *)malloc(sizeof(char)*15);
char *tmp = p1;
p1 = p2;
free(tmp);
free(p1);

こうすることによって未解放のメモリが発生する事を防ぐことができます。

ケース2

ケース2は二次元配列のメモリ解放です。これは割と有名かもしれませんが、意外とfreeした気になるので注意が必要です!
例えば以下のケース

static int	ft_free(char **ans, int len)
 {
 	while (len > 0)
 	{
 		free(ans[len]);
 		len--;
 	}
 	return (-1);
 }

これではメモリリークが発生します。ちゃんとwhileを回してfreeしているのに何が悪いのでしょう?
image.png
そう親元のans配列自体をfreeし忘れていることになります。
つまり先ほどのコードは

static int	ft_free(char **ans, int len)
 {
 	while (len > 0)
 	{
 		free(ans[len]);
 		len--;
 	}
      free(ans);
 	return (-1);
 }

とするのが正しいでのです。

mallocは先頭アドレスを返しているという事は意外と忘れられがちなので、覚えておきましょう!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Comments

fujitanozomu
@fujitanozomu(藤田 望)

つまり先ほどのコードは

static int	ft_free(char **ans, int len)
 {
 	while (len > 0)
 	{
 		free(ans[len]);
 		len--;
	}
      free(ans);
 	return (-1);
 }

とするのが正しいでのです。

引数len1が与えられた場合ans[1]freeされますが正しいですか?

0

Let's comment your feelings that are more than good

Being held Article posting campaign

0
0

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address