Обтекание старых структур C с помощью интеллектуальных указателей в C ++ 11 и автоматическое их освобождение
я используюWord-Netстарая библиотека C, разработанная Принстонским университетом еще в девяностые годы. Библиотека написана на C и показывает только заголовки, но не ее фактическую реализацию.
Единственная структура, которую я использую:
SynsetPtr
И две функции, которые я вызываю:
findtheinfo_ds
traceptrs_ds
Обе эти функции возвращают SynsetPtr.
Однако, когда SynsetPtr представляет список смыслов, я должен освободить его, используя
free_syns
Принимая во внимание, что когда SynsetPtr используется для обхода связанного списка (иерархического дерева), я должен освободить его, используя
free_synset
Документация Не очень понятно, когда звонить, и почему.
Это быстро становится кошмаром для меня. Я потратил три дня, медленно пробираясь через утечки, двойные освобождения, выделения памяти и тому подобное.
Итак, мне было интересно, есть ли способ для меня, чтобы обернуть вокруг этих функций или фактической структуры, и заставить C ++ управлять памятью? В идеале я хотел бы, чтобы они были свободны, когда на них больше нет ссылок, как в случае с std :: shared_ptr.
Возможно ли это, зная, что Synset_Ptr не имеет деструктора, но должна вызываться функция dealloc?
В качестве альтернативы, могу ли я обернуть вокруг две функции, которые создают (распределяют) эти структуры, каким-то образом ведут учет объектов и уничтожают их, когда не остается ссылок на них?
Я был бы очень признателен за любую помощь!
РЕДАКТИРОВАТЬ:
Это точное объявление SynsetPtr в wn.h
/* Structure for data file synset */
typedef struct ss {
long hereiam; /* current file position */
int sstype; /* type of ADJ synset */
int fnum; /* file number that synset comes from */
char *pos; /* part of speech */
int wcount; /* number of words in synset */
char **words; /* words in synset */
int *lexid; /* unique id in lexicographer file */
int *wnsns; /* sense number in wordnet */
int whichword; /* which word in synset we're looking for */
int ptrcount; /* number of pointers */
int *ptrtyp; /* pointer types */
long *ptroff; /* pointer offsets */
int *ppos; /* pointer part of speech */
int *pto; /* pointer 'to' fields */
int *pfrm; /* pointer 'from' fields */
int fcount; /* number of verb frames */
int *frmid; /* frame numbers */
int *frmto; /* frame 'to' fields */
char *defn; /* synset gloss (definition) */
unsigned int key; /* unique synset key */
/* these fields are used if a data structure is returned
instead of a text buffer */
struct ss *nextss; /* ptr to next synset containing searchword */
struct ss *nextform; /* ptr to list of synsets for alternate
spelling of wordform */
int searchtype; /* type of search performed */
struct ss *ptrlist; /* ptr to synset list result of search */
char *headword; /* if pos is "s", this is cluster head word */
short headsense; /* sense number of headword */
} Synset;
typedef Synset *SynsetPtr;
/* Primary search algorithm for use with programs (returns data structure) */
extern SynsetPtr findtheinfo_ds(char *, int, int, int);
/* Recursive search algorithm to trace a pointer tree and return results
in linked list of data structures. */
SynsetPtr traceptrs_ds(SynsetPtr, int, int, int);
/* Free a synset linked list allocated by findtheinfo_ds() */
extern void free_syns(SynsetPtr);
/* Free a synset */
extern void free_synset(SynsetPtr);
И это по сути все, что я знаю.
РЕДАКТИРОВАТЬ 2:
Несмотря на то, что я использовал два ответа ниже, к сожалению, функции все еще пропускают байты.
Это только кажется, что происходит с:
traceptrs_ds ( ptr, SIMPTR, ADJ, 0 )
В документации очень мало информации о прилагательных синонимах (-synsa) или других типах (-synsn, -synsv).
Однако мне удалось повторитьсамый из них, просто следуя ptr-> ptrlist && ptr-> nextss;
traceptr_ds повторяетсяВСЕ из них, но я не могу найти способ избежать утечки, даже при использовании миниатюрной тестовой проги.
Спасибо, кто помог, очень ценится.