💻

leaksコマンドでメモリリークを確認する

2020/12/29に公開2

C言語のプログラムを書いていると、メモリリークは非常に厄介です。
コンパイルエラーが出ないので、自分からチェックしなければなりません。
本当はValgrindを使いたいんですが、残念ながらCatalina以降のmacOSに対応しておらず、泣く泣くleaksコマンドを使っています。
このleaksコマンドについて、スマートな使い方を知ったので紹介します。

前までの使い方

まずは以前の使い方。
知ってるよ!という方は飛ばしてください。

  • main関数の末尾にwhile (1)を入れる
main.c
int main(void) {
	// 処理内容
	while(1)
		;
	return 0;
}
  • コンパイルして実行する
Terminal
$ gcc main.c
$ ./a.out
  • メモリリークを確認する
Terminal
$ leaks a.out

Process 12276: 170 nodes malloced for 12 KB
Process 12276: 0 leaks for 0 total leaked bytes.
  • psコマンドでa.outのプロセスID(PID)を確認し、プロセスを終了する
Terminal
$ ps

PID TTY           TIME CMD
12097 ttys000    0:00.27 -zsh
12276 ttys000    0:00.00 ./a.out

$ kill 12276

新しく知った使い方

なんだか手順が多いなあって思ってました。
そして見つけたのが、system関数を用いる方法です。

  • main関数にsystem("leaks a.out");を入れる
main.c
int main(void) {
	// 処理内容
	system("leaks a.out");
	return 0;
}


a.outを実行するだけで、メモリリークまで確認できる
なんとこれだけ!!!while (1)の無限ループを起こしていないので、PIDを確認してkillする必要もありません。a.outを実行すると、実行結果の表示に続けてleaksコマンドの結果が表示されます。すごい!!

Discussion

ハヤシハヤシ

-atExitオプションをつけてleaksコマンドを実行してあげるとプログラム本体に手を加えなくて済むので楽かなと思います。

leaks -atExit -- ./a.out
Yusuke HakamayaYusuke Hakamaya

存じ上げませんでした。貴重なコメントありがとうございます!!これからは -atExit つけて実行します 🥰