Вот фрагмент расширения для TCL, написанный на C (++) (что здесь C++ не имеет значения - я просто использую std::vector
). Я использую Tcl_Format
для создания новой форматированной строки. Если я не использую Tcl_DecrRefCount
, сообщает Xcode больше и больше памяти используется каждый раз, когда эта внешняя процедура называется:Использование памяти Tcl_Format
int TclME::vTestExt(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[])
{
Tcl_Obj *resultPtr, *item[1], *itemFormatted;
size_t N;
std::vector<long> v;
populate_v(v);
N = v.size();
resultPtr = Tcl_NewListObj(0, NULL);
for (long i = 0; i < N; ++i) {
item[0] = Tcl_NewLongObj(v[i]);
printf("item[0] ref %i, sh %i; ", item[0]->refCount, Tcl_IsShared(item[0]));
itemFormatted = Tcl_Format(interp, "#%06X", 1, item);
// With Tcl_DecrRefCount commented out, there is a memory leak
printf("\tref %i, sh %i; ", item[0]->refCount, Tcl_IsShared(item[0]));
Tcl_DecrRefCount(item[0]);
printf("\tref %i, sh %i\n", item[0]->refCount, Tcl_IsShared(item[0]));
Tcl_ListObjAppendElement(interp, resultPtr, itemFormatted);
}
Tcl_SetObjResult(interp, resultPtr);
return TCL_OK;
}
void populate_v(std::vector<long> &v)
устанавливает вектор элементов.
Выход item[0] ref 0, sh 0; ref 0, sh 0; ref -1, sh 0
, поэтому я не ожидал, что вам придется позвонить Tcl_DecrRefCount
вручную.
Что я пропустил?
желание, которое я мог бы дать 2+, для 'Tcl_ObjPrintf' и объясняя * капля * немного. – zeeMonkeez
Раньше это было очень неприятно, чтобы генерировать подобные вещи; поэтому добавлен Tcl_ObjPrintf'. –