一直在工作上使用的語言都是帶有 Garbage Collection 的語言,只要照著 Best Practice 走很難會遇到 memory error 的問題。

最近回到學校讀研究所,這學期修的課每一門幾乎都要用 C++ 去寫作業。

工作了兩年,帶來的好習慣大概是會習慣去測試極端的情境寫出來的程式會不會出現問題,果然暌違多年沒有寫 C++,一寫 malloc() / free() 馬上就出現 memory error 的問題。 (又或者以前根本不會關注 memory error 的問題 XD)

Valgrind 是個好工具,幫我在作業找到兩個很難找到的 memory error 的問題。

使用的指令大致如下:

~$ valgrind --tool=memcheck --log-file=./valgrind_report.log --leak-check=full --show-reachable=yes --track-origins=yes ./binary
# Command source:[<https://cloud.tencent.com/developer/article/1005616>](<https://cloud.tencent.com/developer/article/1005616>)

遇到的問題也蠻有趣的,簡單紀錄一下


作業中我會呼叫 Linux System 的 API execvp ,API 的原型如下:

int execvp(const char *file, char *const argv[]);

execvp 第二個參數會收一個 char *const argv[] 是準備要餵給 new process image 的參數。

我在 C++ 所有字串都儘量使用 std::string 儲存,可是為了要跟 Linux API 打交道,勢必要將 std::string[] 轉為 char *const[]。

原先我是這樣寫轉換的:

c.argv = (char**) malloc(sizeof(char*) * strArgvs.size() + 2); // strArgvs.size() == 2

strArgvs 存的是程式的參數,這個例子 .size() 的數量是 2,execvp argv 的慣例是 argv[0] 要放 binary nameargv[len(argv) - 1] 要放 nullptr,所以我需要一個 char *const argv[4]。


看似沒有什麼問題,可是我的程式只要處理幾個 input 之後就會終止然後噴出以下錯誤:

free(): invalid pointer

gdb 程式中斷在一個很奇怪的地方,是在 std::regex_search 我一直百思不得其解,GNU GCC 實現的 std::regex_search 該不會 ... 有 bug 吧?

後來嘗試使用 valgrind 跑了一下我的程式,valgrind_report.log 顯示下面的錯誤