소스 검색

avoid valgrind report memory leak

ithewei 3 년 전
부모
커밋
57d009e441
2개의 변경된 파일25개의 추가작업 그리고 8개의 파일을 삭제
  1. 23 6
      base/hmain.c
  2. 2 2
      base/hmain.h

+ 23 - 6
base/hmain.c

@@ -165,15 +165,32 @@ int main_ctx_init(int argc, char** argv) {
     g_main_ctx.worker_userdata = 0;
     g_main_ctx.proc_ctxs = NULL;
 
+    atexit(main_ctx_free);
     return 0;
 }
 
-void main_ctx_finish() {
-    SAFE_FREE( g_main_ctx.save_argv[ 0 ] );
-    SAFE_FREE( g_main_ctx.save_argv );
-    SAFE_FREE( g_main_ctx.cmdline );
-    SAFE_FREE( g_main_ctx.save_envp[ 0 ] );
-    SAFE_FREE( g_main_ctx.save_envp );
+void main_ctx_free() {
+    if (g_main_ctx.save_argv) {
+        SAFE_FREE(g_main_ctx.save_argv[0]);
+        SAFE_FREE(g_main_ctx.save_argv);
+    }
+    SAFE_FREE(g_main_ctx.cmdline);
+    if (g_main_ctx.save_envp) {
+        SAFE_FREE(g_main_ctx.save_envp[0]);
+        SAFE_FREE(g_main_ctx.save_envp);
+    }
+    if (g_main_ctx.arg_kv) {
+        for (int i = 0; i < g_main_ctx.arg_kv_size; ++i) {
+            SAFE_FREE(g_main_ctx.arg_kv[i]);
+        }
+        SAFE_FREE(g_main_ctx.arg_kv);
+    }
+    if (g_main_ctx.arg_list) {
+        for (int i = 0; i < g_main_ctx.arg_list_size; ++i) {
+            SAFE_FREE(g_main_ctx.arg_list[i]);
+        }
+        SAFE_FREE(g_main_ctx.arg_list);
+    }
 }
 
 #define UNDEFINED_OPTION    -1

+ 2 - 2
base/hmain.h

@@ -67,8 +67,8 @@ typedef struct option_s {
     int         arg_type;
 } option_t;
 
-HV_EXPORT int main_ctx_init(int argc, char** argv);
-HV_EXPORT void main_ctx_finish();
+HV_EXPORT int  main_ctx_init(int argc, char** argv);
+HV_EXPORT void main_ctx_free();
 
 // ls -a -l
 // ls -al