Tcl C API 中Tcl_Obj的创建和管理

风行水上 @ 2013-10-16 14:04:41
标签:

    Tcl_Obj是Tcl C API中最基本的数据类型。

    Tcl中一切数据都是字符串的特点。Tcl_Obj最基本的创建形式有两种:Tcl_NewObjTcl_NewStringObj

    Tcl_Obj在在需要时进行必要的类型转换。这种转换多数时候会自动进行。

    Tcl_Obj的内存管理

    Tcl_Obj通过引用计数(ref count)进行内存管理。

    • Tcl_Obj 在创建之初通常引用计数为0
    • Tcl_IncrRefCount :引用计数加1
    • Tcl_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;
    }
    

    网络资源

    标签:

      分享到:
      comments powered by Disqus

      29/32ms