#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int index = 0;
int max_size = 5;
void **mem = NULL;

void *newmem(size_t size) {
	void *temp = malloc(size), **temp2;
	int i;
	if (temp == NULL) {
		exit(EXIT_FAILURE);
	}
	if (mem == NULL) {
		mem = (void**)malloc(max_size * sizeof(void*));
		if (mem == NULL) {
			exit(EXIT_FAILURE);
		}
	}
	mem[index++] = temp;
	if (index >= max_size) {
		temp2 = (void**)realloc(mem, (max_size + 5) * sizeof(void*));
		if (temp2 == NULL) {
			exit(EXIT_FAILURE);
		}
		mem = temp2;
		max_size += 5;
	}
	puts("alloc!");
	return temp;
}

void releasemem(void) {
	int i;
	if (mem == NULL) {
		return;
	}
	for (i = 0; i < index; i++) {
		if (mem[i] != NULL) {
			printf("%d ", *(int*)mem[i]);
			free(mem[i]);
			mem[i] = NULL;
			puts("free!");
		}
	}
	free(mem);
	index = 0;
	mem = NULL;
}

void foo() {
	puts("abort");
	abort();
}

void bar() {
	puts("exit failure");
	exit(EXIT_FAILURE);
}

void baz() {
	puts("exit success");
	exit(EXIT_SUCCESS);
}


int main(void) {
	int i, *p;
	
	atexit(releasemem);
	signal(SIGABRT, releasemem);
	
	for (i = 0; i < 15; i++) {
		p = (int*)newmem(sizeof(int));
		*p = i;
	}
	
	i = getchar();
	if (i == '1') {
		foo();
	} else if (i == '2') {
		bar();
	} else if (i == '3') {
		baz();
	}
	
	puts("finish");
	return 0;
}
