💻
leaksコマンドでメモリリークを確認する
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コマンドを実行してあげるとプログラム本体に手を加えなくて済むので楽かなと思います。存じ上げませんでした。貴重なコメントありがとうございます!!これからは
-atExitつけて実行します 🥰