Python如何清理驻留的字符串

Python如何清理驻留的字符串
Python如何清理驻留的字符串

1、说明

清除函数从interneddictionary遍历所有字符串,调整这些对象的引用计数,并将它们标记为NOT_INTERNED,这样垃圾回收就可以了。当所有的字符串都被标记为NOT_INTERNED时,将清空并删除interned字典。

2、清理实例

这个清理函数就是_PyUnicode_ClearInterned,在 unicodeobject.c 中定义。

 void
  _PyUnicode_ClearInterned(PyThreadState *tstate)
  {
      .........
  
      // Get all the keys to the interned dictionary
      PyObject *keys = PyDict_Keys(interned);
  
      .........
  
      // Interned Unicode strings are not forcibly deallocated;
      // rather, we give them their stolen references back
      // and then clear and DECREF the interned dict.
  
      for (Py_ssize_t i = 0; i < n; i++) {
          PyObject *s = PyList_GET_ITEM(keys, i);
  
          .........
  
          switch (PyUnicode_CHECK_INTERNED(s)) {
          case SSTATE_INTERNED_IMMORTAL:
              Py_SET_REFCNT(s, Py_REFCNT(s) + 1);
              break;
          case SSTATE_INTERNED_MORTAL:
              // Restore the two references (key and value) ignored
              // by PyUnicode_InternInPlace().
              Py_SET_REFCNT(s, Py_REFCNT(s) + 2);
              break;
          case SSTATE_NOT_INTERNED:
              /* fall through */
          default:
              Py_UNREACHABLE();
          }
  
          // marking the string to be NOT_INTERNED
          _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED;
      }
  
      // decreasing the reference to the initialized and
      // access keys object.
      Py_DECREF(keys);
  
      // clearing the dictionary
      PyDict_Clear(interned);
  
      // clearing the object interned
      Py_CLEAR(interned);
  }

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注