💻

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

1 min read

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

Valgring for macOS Catalinaは以下リンクから利用できます。
自分は諸事情あって使えませんでした 😇
https://github.com/LouisBrunner/valgrind-macos

前までの使い方

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

  • 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

ログインするとコメントできます