Я использую Word-Net, старую библиотеку C, разработанную Принстонским университетом еще в девяностые годы. Библиотека написана на C и только раскрывает заголовки, но не ее фактическую реализацию.Обтекание старых C структур с помощью умных указателей в C++ 11 и их автоматическое освобождение
Единственная структура я использую:
SynsetPtr
И эти две функции я называю это:
findtheinfo_ds
traceptrs_ds
Обе эти функции возвращают SynsetPtr.
Howevever, когда SynsetPtr представляет список чувств, я должен освободить его с помощью
free_syns
В то время, когда SynsetPtr используется для обхода связанного списка (иерархическое дерево), я должен освободить его используя
free_synset
Documentation не совсем понятно, когда звонить, который, и почему.
Это быстро становится для меня кошмаром. Я провел три дня, медленно прокладывая себе путь через утечки, двойные освобождения, распределения памяти и т. Д.
Так что мне было интересно, есть ли способ для меня, обернуть вокруг этих функций или фактическую структуру и сделать C++ управлять памятью? В идеале я бы хотел, чтобы они были свободны, когда больше нет ссылок на них, как в случае с std :: shared_ptr.
Возможно ли это, зная, что Synset_Ptr не имеет деструктора, но должна быть вызвана функция dealloc?
В качестве альтернативы, можно ли обернуть вокруг двух функций, которые создают (распределять) эти структуры, как-то хранить книги и уничтожать их, когда ссылки на них не остаются?
Я был бы очень признателен за любую помощь!
EDIT:
Это точная декларация 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);
И это, по существу, все, что я знаю.
EDIT 2:
Даже если я использовал два ответа ниже, к сожалению, функции по-прежнему протекающие байт.
Это только кажется, что происходит с:
traceptrs_ds (ptr, SIMPTR, ADJ, 0)
Документация, имеет очень мало информации о прилагательных синонимов (-synsa) или других типов (-synsn, -synsv).
Однако мне удалось итерацию наиболее из них, просто следуя ptr-> ptrlist & & ptr-> nextss;
traceptr_ds выполняет итерации ВСЕХ из них, но я не могу найти способ избежать утечки, даже если вы используете минитипированную тестовую прог.
Благодаря тому, кто помогал, очень ценю.
Вы знаете, когда вы создаете объекты, типа это (дерево или список), и может ли изменение типа? – user3286380
Вероятно, нет причин, по которым вы не могли бы обернуть функцию create в конструкторе C++ и вызвать соответствующий бесплатный метод в деструкторе. Сделать класс упаковки неизменным будет очень помогать. Затем используйте один из стандартных методов подсчета ссылок для доступа к вашему классу инкапсуляции. –
Я могу заключить, что создано. Первая функция создает связанный список синхронизаций, вторая функция обходит одну из них, возвращая указатель синхронизации в списке. Весь дизайн действительно запутан, и я попытался связаться с авторами безрезультатно. –