OSDN Git Service

referenceCountを導入。今のところ正常に動作している。メモリリークについても一部改善。69.67KB(1852/2023)>36.59KB(588/2163)
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib01.c
index b8c5fce..11d74d8 100644 (file)
@@ -31,6 +31,7 @@ char *CHNLIB_String_Intenal_NullCString = "";
 //\r
 \r
 CHNLIB_String *CHNLIB_String_Internal_Allocate(void);\r
+void CHNLIB_String_Internal_Destruct(void **structure);\r
 \r
 //\r
 //Define types\r
@@ -53,6 +54,7 @@ CHNLIB_String *CHNLIB_String_Initialize(const char str[])
     CHNLIB_String *strtag;\r
     \r
     strtag = CHNLIB_String_Internal_Allocate();\r
+    strtag->header.destructor = &CHNLIB_String_Internal_Destruct;\r
     \r
     if(str != NULL){\r
         CHNLIB_String_SetStringFromCString(strtag, str);\r
@@ -357,4 +359,22 @@ CHNLIB_String *CHNLIB_String_Internal_Allocate(void)
     CHNLIB_StructureHeader_Initialize(&tag->header, CHNLIB_STRUCT_ID_String);\r
     \r
     return tag;\r
-}
\ No newline at end of file
+}\r
+\r
+void CHNLIB_String_Internal_Destruct(void **structure)\r
+{\r
+    //デストラクタ(実際にRelease->freeされる時に呼ばれる)\r
+    if(structure == NULL){\r
+        return;\r
+    }\r
+    \r
+#ifdef DEBUG_MEMORY_REFERENCE_COUNT\r
+    CHNLIB_Debug("Release(with free)[%p].", CHNLIB_DEBUG_ARGUMENTS, *structure);\r
+#endif\r
+    \r
+    CHNLIB_String_Free(*structure);\r
+    \r
+    *structure = NULL;\r
+    \r
+    return;\r
+}\r