Здравствуйте, fk0, Вы писали:
C>>На практике можно использовать __attribute__((cleanup)) и не заморачиваться. Поддерживается GCC, clang, icc. А на MSVC уже можно забить.
fk0> Нельзя. Проблема в том, что во-первых не стандарт, во-вторых, что самое главное, работает
fk0>только в рамках функции, а не блока кода.
Неверно.
#include <stdio.h>
#include <stdlib.h>
void scream(void *ptr_ptr) {
void *ptr = * (void **) ptr_ptr;
printf("Scream!\n");
if (ptr) {
printf("Not Null!\n");
free(ptr);
}
}
int main() {
for(int f=0; f<5; ++f) {
void *data __attribute__((cleanup(scream))) = malloc(123);
if (f>2) {
free(data);
data = 0;
}
}
}
Вывод:
Scream!
Not Null!
Scream!
Not Null!
Scream!
Not Null!
Scream!
Scream!
Как адаптировать к lock_guard'у с возможностью предварительного отключения — задача для читателя.