Нет, это не присуще C ... чтобы включить что-то вроде того, о чем вы просите, вам потребуется создать какой-то механизм обратного вызова, который будет использовать справочную таблицу для сопоставления объекта с его «разрушитель» и вызывает эту общую функцию обратного вызова в конце каждой функции, которую вы пишете, или, более вероятно, в конце каждой области видимости, где был объявлен объект. Я бы посчитал это очень запутанным и сложным, и, в конце концов, это, вероятно, намного сложнее, чем стоит, т. Е. Вы могли бы просто использовать goto
и написать весь свой код очистки в конце функции (я в общем, использование goto
считается очень плохим стилем, но для перехода к коду очистки в конце функции они могут сделать код намного чище, чем альтернатива, которая состоит в том, чтобы повторять одно и то же очищение каждый раз при появлении ошибки).
Например, предположим, что у вас есть функция, которая выделяет некоторую память и открывает файловый дескриптор в какой-то ранний момент в функции, но затем, если были некоторые ошибки, невозможно продолжить ... вы не можете просто вернуть ошибку код, вы должны сделать некоторую очистку, но было бы больно повторять код очистки снова и снова прямо в середине кода:
int my_function()
{
int* array_on_heap = malloc(ARRAYSIZE * sizeof(int));
int file_descriptor;
//...some code
if (some_ptr == NULL)
goto error_cleanup;
//...some more code
if (some_other_pointer != some_ptr)
goto error_cleanup;
//...even more code
//normal return with no error
return 0;
error_cleanup:
//clean-up code in case there was an error
free(array_on_heap);
close(fd);
return -1;
}
Это осознанное и разумное использование goto
здесь создает очень лаконичную область функции, в которой могут происходить разрушение и очистка, и вам не нужно беспокоиться о возможной потере функциональности очистки, если вы решили посыпать код очистки действительной «механикой» самой функции.