LINUX.ORG.RU

Деструкторы в C


0

0

Здраствуйте! Как в C (именно в C!!!) эмулировать деструкторы. То есть, есть нечто, хто создаётся на стеке. После выхода из скопа надо автоматически вызвать callback.

в голову пока что приходит только такой метод:
есть некоторый аки объект:

#define REGISTER_OBJ(obj, type) obj.destruct = do_##type_destruct
#define UNREGISTER_OBJ(obj) obj.destruct()

static void do_type1_destruct(void)
{
...
}

...

static void do_typeN_destruct(void)
{
...
}

struct obj {
/* some data */
void (*destruct)(void);
};

void f()
{
struct obj = malloc();

obj.field1 = init_field1();
..
obj.fieldN = init_fieldN();
REGISTER_OBJECT(obj, type1);
....
....
....
UNREGISTER_OBJECT(obj);
}

asgard
()
Ответ на: комментарий от LestorN

> А это не сборка мусора?

кстати да.. сборка мусора это конечно более сложная задача, но эту задачу можно свести к сборке мусора..

dilmah ★★★★★
()

Как простой вариант:

Написать свои функции выделения/освобождения памяти, в который указатели на выделенные участки памяти будут также сохраняться в каком-либо статическом списке. Написать также две функции enter_scope() и leave_scope(), первая из которых будет ложить в стек 0, а вторая - освобождать из стека все значения до первого 0-я.

Сразу после входа в блок вызываем enter_scope(), перед выходом - leave_scope().

satanic-mechanic
()
Ответ на: комментарий от the_coder

Полностью автоматически - пожалуй, никак. Какой бы способ сборки мусора ни использовался, надо в явном виде указывать окончание работы очередного блока кода (чтоб мусор можно было собрать).

svu ★★★★★
()

Сделай

#define return call_destructors(); return

И пиши в процедурах return; в конце.
Это все конечно будет работать для функции а не для скопа.

Только все же лучше взять C++.

Legioner ★★★★★
()

#define { { enter_scope();
#define } leave_scope(); }

ещё как-нить создание своего struct заменить на struct + функция регистрации потом leave_scope(); найдёт их и очистит

можно добавить доп. указатель к каждой структуре, который будет указывать на таблицу методов приминимых к структуре...

и т.д. пока не изобретёшь С++

можно ещё пытаться извращаться со стеком добавляя при каждом создание новую функции, изменяя адрес возврата и т.п.

anonymous
()
Ответ на: комментарий от klalafuda

Лучше:
#define begin { enter_scope(); {
#define end } leave_scope(); }

И будет Pascal :)

rymis ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.