- 论坛徽章:
- 0
|
1.设计上有问题,谁分配谁释放。这是上面某位仁兄已经讲过的。整个项目应该有一套完整的内存管理api,例如php语言就有一套完整的模拟c标准库的内存管理api,这保证了及时某块内存没有被及时释放也会在进程结束时内存被释放。
2.在getMem函数中return p,返回的是p所指向的内存地址,而不是p本身,所以你在getMem中执行printf("%d\n",p)和在main中执行printf("%d\n",p)其结果是同一个内存地址,但是如果你在两个函数中分别执行printf("%d\n",&p),其结果却不相同,这说明getMem堆栈中的p变量和main中p变量是不同的两个变量,但是其值却相同,而在系统执行完getMem函数后,如何将p的值返回给调用函数,这个可能需要其他一些机制,这个我不太清楚,希望哪位仁兄不啬赐教。
3.free(p)只是一个标识,这个大家都知道,并不代表系统禁止这个进程访问该段内存了。我想系统内存实现应该有这类错误检查,即如果某块内存没有被引用,那么未分配内存的访问将会出现错误,现在的机制只是让某个进程不能在没有权限的情况下访问另外一个进程的内存空间,而不禁止其访问未分配的内存空间。
4.总结一下,这个程序最大的毛病就是模块设计上的问题,而不是其他。良好的设计根本不会出现这类代码,也许那个面试官写过。
我再补充一下第2点,如果p的形式为char *p="Hello world";或者 char p[100],这个时候返回p很明显会出错,关于第一个,p及p所指向的空间“Hello world"都是getMem函数的私有物;而对于char p[100],很明显这个数组是由编译器非配在栈中的,函数执行完,那么内存空间消失,而对于例子中,p所指向的内存空间并非私有,应该属于进程私有(不太精确),但不属于进程内某个块代码私有。
[ 本帖最后由 hobbs136 于 2009-12-3 14:06 编辑 ] |
|