C语言模仿C#事件
2016-03-06 20:13
465 查看
我在学C#事件和委托的时候,突然想到C语言能不能仿写,做了下面一个小程序,暂时没有发现有什么用处
在上面的创建函数时我发现了一个问题,我在外部定义了一个指针变量,本以为传入的eventlist是指针,在函数内分配空间后,eventlist已经指向了分配的空间,其实根本不是这样的。在这里虽然传入的是指针,但是在函数内会创建一个副本head,此时的副本heand指向创建空间,而根本没有对eventlist赋值。
并且在Create函数执行完之后由于head存在栈中会自动消失,此时创建的堆空间就会变成垃圾,严重的照成内存泄漏。
#include <stdio.h> #include <malloc.h> typedef void(*EventHandler)();//定义一个函数指针类型 //定义事件链表 typedef struct _EventList { EventHandler eventhandler; struct _EventList *Next; }*EventList; EventList Create(EventList head)//创建一条事件链表 { head = (EventList)malloc(sizeof(struct _EventList)); head->eventhandler = NULL; head->Next = NULL; return head; } //添加事件,传入函数 void Add(EventList head, EventHandler newEventHandler) { EventList event = head; EventList newEvent = (EventList)malloc(sizeof(struct _EventList)); while(event->Next) { event = event->Next; } event->Next = newEvent; newEvent->eventhandler = newEventHandler; newEvent->Next = NULL; } //执行事件,运行所有函数 void Exec(EventList head) { EventList event = head->Next; if(event == NULL) return; while(event) { (event->eventhandler)(); event = event->Next; } } //事件1 void Disp() { printf("Disp\n"); } //事件2 void Print() { printf("Print\n"); } int main() { EventList eventlist = NULL; eventlist = Create(eventlist); Add(eventlist,Disp); Add(eventlist,Print); Add(eventlist,Print); Add(eventlist,Disp); Exec(eventlist); return 0; }
在上面的创建函数时我发现了一个问题,我在外部定义了一个指针变量,本以为传入的eventlist是指针,在函数内分配空间后,eventlist已经指向了分配的空间,其实根本不是这样的。在这里虽然传入的是指针,但是在函数内会创建一个副本head,此时的副本heand指向创建空间,而根本没有对eventlist赋值。
并且在Create函数执行完之后由于head存在栈中会自动消失,此时创建的堆空间就会变成垃圾,严重的照成内存泄漏。
相关文章推荐
- PAT (Advanced Level) Practice 1006
- 九度-简单题 题目1065:输出梯形
- C++中的类所占内存空间总结
- hello c world
- VS2010读写EXCEL07遇到的错误处理
- 、给一组字符串,需要你输出最小长度的字符串与最大长度的字符串,如果有相同最小(大)长度的,就按照给的顺序挨个输出。
- C++ STL泛型编程
- 学习C++反汇编-菱形继承
- C语言中#define的用法(转)
- C++ list的基本操作和使用
- 简易C/C++日志代码实现
- 基本排序算法总结(C/C++)
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- c语言面试题2
- c语言之 malloc函数详解
- 数据库和HTML还有C语言总结
- 跨平台C、C++代码注意的事项及如何编写跨平台的C/C++代码
- 折半查找法/C语言版
- C语言之strlen和sizeof有什么区别
- 《C语言点滴》学习笔记