LINUX.ORG.RU

Ответ на: комментарий от imb

atexit не позволяет передавать аргументы. on_exit нет на некоторых платформах. Нет какого-нибудь более элегантного способа, чем запихивание указателей в глобальный массив с использованием atexit?

Deleted
()

а зачем ему передавать указатели на какую-то там память, если она всё одно чохом освободится ??

atexit должен приводить в порядок внешние вещи - подчистть временные файлы, сбросить данные в базы если надо, чё-то кому-то прсигналить и усё..

MKuznetsov ★★★★★
()
Ответ на: комментарий от Deleted

on_exit нет на некоторых платформах.

Сделай свой on_exit. Должно быть тривиально. Или скопируй из bsd.

hateyoufeel ★★★★★
()
Ответ на: комментарий от MKuznetsov

а зачем ему передавать указатели на какую-то там память

atexit должен приводить в порядок внешние вещи - подчистть временные файлы, сбросить данные в базы если надо

А указатели на файлы и базы как передавать? Или все файлы должны быть в глобальных переменных?

monk ★★★★★
()

Как назначить обработчик выхода и передать ему указатели для освобождения памяти?

зачем? Память сама освободится, и все файлы закроются:

       The  function _exit() terminates the calling process "immediately".  Any open file descriptors
       belonging to the process are closed; any children of the process are inherited by  process  1,
       init, and the process's parent is sent a SIGCHLD signal.

       The  value  status  is returned to the parent process as the process's exit status, and can be
       collected using one of the wait(2) family of calls.

       The function _Exit() is equivalent to _exit().
emulek
()
Ответ на: комментарий от monk

А указатели на файлы и базы как передавать? Или все файлы должны быть в глобальных переменных?

вызывай специальные функции очистки. Можно использовать глобальные переменные, но ограничить их область видимости одним файлом. Тогда можно написать функцию очистки, и вызвать её на выходе. Такая вот инкапсуляция на уровне файла. Ну нету в сишке классов.

emulek
()
Ответ на: комментарий от Deleted

дык в том файле (win.c к примеру), где окно открывается, сделай глобальный static дескриптор этого окна. И функцию, которая это окно закрывает. Эту функцию вызывай при завершении.

Дескриптор окна хотя и будет глобальным, однако доступ к нему будет только из этого win.c файла.

AFAIK по другому в сишке инкапсуляцию не сделать. С другой стороны, без глобальных переменных тоже тут не получится.

emulek
()

Перед точкой нормального выхода вставить необходимую очистку. Так же вставить очистку в обрабочик сигналов.

four_str_sam
()
Ответ на: комментарий от Deleted

Мне ещё нужно SDL остановить и окно уничтожить

если ты SDL не остановишь, он что у вас вечно вместе с окном висеть остаётся ? Сдаётся что нет :) Максимум что нужно сделать - звук выключить, а то последний семпл может зациклиться.

и вообще у вас неправильное отношение в abort/exit/atexit. exit должен вызываться когда программа по каким-то причинам не может работать дальше - нехватка ресурсов, таймауты и прочее и при этом возрат по цепочке return-return невозможен или гарантированно ухудшит ситуацию. Заниматься освобождением всякого внутри atexit - дело наблагодарное, потому как во первых ситуация тёжелая (exit вызван не просто так) а во вторых с большой вероятностью программа может быть прибита сигналом.

MKuznetsov ★★★★★
()
Ответ на: комментарий от imb

Unless absolutely necessary, please avoid using atexit()

imb

man 3 atexit

OpenBSD man:

atexit() is very difficult to use correctly without creating exit(3)-time races. Unless absolutely necessary, please avoid using it.

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

romeo250501

Нет какого-нибудь более элегантного способа, чем запихивание указателей в глобальный массив с использованием atexit?

Нет.

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