Хрестоматия по программированию на Си в Unix



         

Примеры. Хрестоматия по программированию на Си в Unix - стр. 2


/* Файл для хранения таблицы указателей */ static int mem_fd = (-1); #define PTABLE "PointerTable.bin"

#define NRECORDS 256 MemFileRecord memrecords[NRECORDS]; /* ============================================================= */ void MEMputTableRecord(AllocFrame *newptr, AllocFrame *oldptr, size_t size, size_t adjsize); void MEMputTableRecordKilled(AllocFrame *ptr); void MEMerasePreviousRecords(AllocFrame *ptr); int MEMcheckRecord(MemFileRecord *rec); int MEMcheck_consistency(AllocFrame *ptr); void MEMmakeRedZones(char *cptr, size_t size, size_t adjsize); void MEMopenFd(); /* ============================================================= */ /* Этим следует пользоваться вместо стандартных функций */ void *MEMmalloc (size_t size); void *MEMrealloc(void *ptr, size_t size); void *MEMcalloc (size_t n, size_t size); void MEMfree (void *ptr);

void MEMcheckAll(); /* это можно вызывать в середине программы */ /* ============================================================= */ void MEMopenFd(){ if(mem_fd < 0){ close(creat(PTABLE, 0644)); /* создать файл */ mem_fd = open(PTABLE, O_RDWR); /* чтение+запись */ unlink(PTABLE); /* только для M_UNIX */

atexit(MEMcheckAll); setlocale(LC_ALL, ""); } }

/* Поместить запись в таблицу всех указателей на * выделенные области памяти. */ void MEMputTableRecord(AllocFrame *newptr, /* для записи */ AllocFrame *oldptr, /* для стирания */ size_t size, /* размер данных */ size_t adjsize /* размер всей записи с зонами */ ){ MemFileRecord memrecord; static int serial = 0;

memrecord.ptr = newptr; memrecord.size = size; memrecord.adjsize = adjsize; memrecord.serial = serial++;

MEMopenFd(); #ifdef CHECKALL /* стереть прежние записи про этот адрес */ MEMerasePreviousRecords(oldptr); #endif lseek(mem_fd, 0L, SEEK_END); /* в конец */ write(mem_fd, &memrecord, sizeof memrecord); /* добавить */ }

/* Сделать запись об уничтожении области памяти */ void MEMputTableRecordKilled(AllocFrame *ptr){ /* Пометить как size=0, adjsize=0 */ MEMputTableRecord(ptr, ptr, 0, 0); }




Содержание  Назад  Вперед