用c/c++写一个堆栈管理程序
2012-09-27 11:06
447 查看
这是一个面试题,那个狗日的面试官让我当场写出来,我要是能写出来也得累出血了。感谢原文作者的贡献,文中还有小错误,会尽快改正。
头文件: #ifndef _KSMFMemory_ #define _KSMFMemory_ #ifndef KCAHR #define KCHAR char #else #define KCHAR short #endif #ifdef _cplusplus extern "C" { #endif void *ks_malloc(int size,KCHAR *file_path,int line); void ks_free(void *p); int ks_get_not_free(); void ks_free_not_free_memory(); #ifdef _cplusplus } #endif #ifdef _DEBUG #ifndef KMALLOC #define KMALLOC(size) ks_malloc(size,_FILE_,_LINE_) #endif #ifndef KFREE #define KFREE(p) ks_free(void*) #endif #ifndef KGETNOTFREE #define KGETNOTFREE ks_get_not_free #endif #ifndef KFREENOTFREE #define KFREENOTFREE ks_free_not_free_memory #endif #else #ifndef KMALLOC #define KMALLOC malloc(size) #endif #ifndef KFREE #define KFREE free(p) #endif #ifndef KGETNOTFREE #define KGETNOTFREE #endif #ifndef KFREENOTFREE #define KFREENOTFREE #endif #endif #endif// 相对应头文件的
主文件: #include "KSMFMemory.h" #include<stdio.h> #include<stdlib.h> #include<memory.h> #ifndef NULL #define NULL ((void*)0) #endif #ifndef INVALID_ADDR #define INVALID_ADDR (0) #endif #ifndef ISMALLOC #define ISMALLOC (1) #endif #ifndef LONG #define LONG(p) ((unsigned long)p) #endif #ifndef BYTE #define BYTE char #endif typedef struct _memory_node { unsigned long IMemoryAddr; KCHAR *s_file_name; int line; struct _memory_node *next; struct _memory_node *pre; }MEM_NODE,*LP_MEMNODE; LP_MEMNODE _node_top=NULL; #ifdef _cplusplus extern "C" #endif static int ks_get_file_name(KCHAR *path,KCHAR **name) {//根据路径返回文件名和文件名的长度 int pos=0; int i=0; if(path==NULL) return 0; while(path[i]!='\0') { if(path[i]=='\\'||path[i]=='/') { pos=i; } i++; } *name=(KCHAR*)&path[pos+1]; if(pos==0) return 0; else return (i-pos); } static KCHAR *ks_strcpy(KCHAR *des,KCHAR *src) {//字符串拷贝 KCHAR *p_temp=src; if(des==NULL||src==NULL) return NULL; while(src!='\0') { *(des++)=*(src++); } src=p_temp; return des; } static LP_MEMNODE ks_create_node() {//建立一个节点,并将节点中的字段赋予初值 LP_MEMNODE new_node=(LP_MEMNODE)malloc(sizeof(MEM_NODE)); if(new_node==NULL) return NULL; new_node->IMemoryAddr=INVALID_ADDR; new_node->next=NULL; new_node->pre=NULL; return new_node; } static void ks_delete_node(LP_MEMNODE p) {//删除节点 if(p==NULL) return; if(p->IMemoryAddr!=INVALID_ADDR) free((void*)p->IMemoryAddr); if(p->s_file_name!=NULL) free(p->s_file_name); free(p); } static LP_MEMNODE ks_add_node(LP_MEMNODE pcurrent,LP_MEMNODE new_node) {//插入节点 if(pcurrent==NULL) { pcurrent=new_node; } else { pcurrent->next=new_node; new_node->pre=pcurrent; } _node_top=new_node; return _node_top; } static LP_MEMNODE ks_remove_node(LP_MEMNODE remove) {//移除某个节点,并返回当前栈中的头节点 if(remove==NULL||_node_top==NULL) return NULL; if(_node_top==remove) { _node_top=remove->pre; ks_delete_node(remove); return _node_top; } if(remove->pre!=NULL) { LP_MEMNODE p_temp1=remove; LP_MEMNODE p_temp2=remove->next; remove=remove->pre; remove->next=p_temp2; if(p_temp1!=NULL) p_temp2->pre=remove; ks_delete_node(p_temp1); return _node_top; } else { LP_MEMNODE p_temp1=remove; LP_MEMNODE p_temp2=remove->next; p_temp2->pre=NULL; ks_delete_node(p_temp1); return _node_top; } } static LP_MEMNODE ks_find_node(unsigned long l_mem_addr) {//返回要查找节点的位置,若没找到,返回NULL; LP_MEMNODE p_temp=_node_top; if(l_mem_addr--==INVALID_ADDR) return NULL; while(p_temp!=NULL) { if(p_temp->IMemoryAddr==l_mem_addr) return p_temp; p_temp=p_temp->pre; } return NULL; } void *ks_malloc(int size,KCHAR *file_path,int line) { LP_MEMNODE p_temp=NULL; KCHAR *name=(KCHAR*)malloc(size*sizeof(KCHAR)+1); void *p=malloc(size+sizeof(BYTE)); int name_len=0; if(p==NULL) return NULL; p_temp=ks_create_node(); if(p_temp==NULL) { free(p); return NULL; } name_len=ks_get_file_name(file_path,&name); p_temp->s_file_name=(KCHAR*)malloc(name_len*sizeof(KCHAR)+1); if(p_temp->s_file_name==NULL) { free(p); ks_delete_node(p_temp); return NULL; } ks_strcpy(p->s_file_name,name); p_temp-line=line; p_temp->IMemoryAddr=LONG(p); ks_add_node(_node_top,p_temp); ++((BYTE*)p); return p; } void ks_free(void *p) { if(p==NULL) return; LP_MEMNODE p_temp=NULL; p_temp=ks_find_node(LONG(p)); if(p_temp!=NULL) { ks_remove_node(p_temp); } } int ks_get_not_free() { int num=0; LP_MEMNODE p_temp=_node_top; while(p_temp!=NULL) { printf("not free memory(0x%x):%s\tline:%d\n",p_temp->IMemoryAddr,p_temp->s_file_name,p_temp->line); p_temp=p_temp->pre; num++; } return num; } void ks_free_not_free_memory() { LP_MEMNODE p_temp=_node_top; while(p_temp!=NULL) { p_temp=_node_top->pre; printf("free memory(0x%x):%s\tline:%d\n",_node_top->IMemoryAddr+sizeof(BYTE),_node_top->s_file_name,_node_top->line); ks_delete_node(_node_top); _node_top=p_temp; } } #ifdef _cpluspluc } #endif
相关文章推荐
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(三)
- 每日一个C++小程序(八)--设计一个人事管理的人员类
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(一)
- [c/c++]为nginx写的一个管理程序
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(二)
- 一个简单关于学生成绩管理的C++程序代码,但是对于拷贝析构函数目前还是不知其作用何在
- C++ 重写了一个学生管理程序(作业题)
- 情人节c++实现的一个小程序
- 计划把财务管理程序改成一个eclipse的插件
- 27_下面是一个完整的C++程序.CPP
- 开发一个c++后台程序的大概步骤
- Lua和C程序通过一个堆栈交换数据
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- 用django做一个午餐账单管理小程序
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- C++字节流与二进制字符串相互转换(一个简单的明文加解密程序)
- C++ 一个程序获取另一个程序Edit控件的内容
- 每天一个C++小程序(求圆面积)
- 【一个C++程序】小课设