crypt of decay - September 11th, 2013 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

September 11th, 2013

крутая штука из самбы: hierarchical, reference counted memory pool system with destructors [Sep. 11th, 2013|06:33 am]
вот.

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

читайте документацию нашу, мать вашу! [Sep. 11th, 2013|07:34 am]
а вот хуй бы я заметил (хоть и сто раз читал злоебучую страницу), что там есть расчудесный аттрибут «cleanup». маленький потыреный пример:
#include <stdlib.h>
#include <stdio.h>

#define autofree  __attribute((cleanup(__autofree)))

static void __autofree (void *p) {
  void **_p = (void**)p;
  printf("free -> %p\n", *_p);
  free(*_p);
}

static void *myalloc (size_t sz) {
  void *ptr;
  if ((ptr = malloc(sz)) == NULL) {
    fprintf(stderr, "malloc failed.\n");
    exit(1);
  }
  printf("malloc -> %p\n", ptr);
  return ptr;
}

int main (int argc, char *argv[]) {
  autofree char *x = myalloc(32);
  {
    autofree int *y = myalloc(64);
    printf("y = %p\n", y);
  }
  printf("x = %p\n", x);
  return 0;
}

конечно, setjmp()/longjmp() в компот насрёт, так что в этом случае таки придётся или ползти на кресты, или ебаться с кастомным препроцессором, который будет создавать unwinder'ы, но во многих других случаях — няняняня!

если кто не понял: няшненький «goto quit;» из очень-вложеного-блока бережно заклеанапит всё, что надо. и да: всякие for() и while() тоже работают: перед повторением тела не менее бережно клеанапят помеченое.

скажите «good night, sweet prince» идиотским ручным очисткам памяти перед всякими аварийными return'ами, break'ами и goto — 21-й век, всё-таки. а кто не использует gcc — тот дурак.
Link104 meows|meow!

navigation
[ viewing | September 11th, 2013 ]
[ go | Previous Day|Next Day ]