💻
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
つけて実行します 🥰