Tcl_Obj
是Tcl C API中最基本的数据类型。
Tcl中一切数据都是字符串的特点。Tcl_Obj最基本的创建形式有两种:Tcl_NewObj
和Tcl_NewStringObj
。
Tcl_Obj在在需要时进行必要的类型转换。这种转换多数时候会自动进行。
Tcl_Obj通过引用计数(ref count)进行内存管理。
Tcl_IncrRefCount
:引用计数加1Tcl_DecrRefCount
:引用计数减1;减到0时释放内存Tcl_SetObjResult
会自动增加引用计数Tcl_ListObjAppendElement
会自动增加引用计数int Tcl_SomeCommand(Tcl_Interp *interp){ const char *str = "123"; Tcl_Obj *obj_int = Tcl_NewStringObj(str,-1) // obj_int.ref_count = 0 if(0) return TCL_OK; // obj_int.ref_count = 0 # Error, memory leak if(0){ Tcl_SetObjResult(interp, obj_int); // obj_int.ref_count +1 = 1 # OK return TCL_OK; } Tcl_Obj *obj_list = Tcl_NewListObj(0, NULL); // obj_list.ref_count = 0 Tcl_ListObjAppendElement(interp, obj_list, obj_int); // obj_int.ref_count +1 = 1 Tcl_Obj *obj_val = Tcl_NewObj(); // obj_val.ref_count = 0 Tcl_ListObjIndex(interp, obj_list, 0, &obj_val); // obj_val = obj_int, // obj_val.ref_count = 1 Tcl_IncrRefCount(obj_val); // obj_val.ref_count +1 = 2 Tcl_DecrRefCount(obj_list); // obj_list.ref_count -1 = 0 # destroy // obj_val.ref_count -1 = 1 // obj_int.ref_count = 1 // obj_list = NULL (invalid) return TCL_OK; }