一个令人狂Faint的内存管理问题!!!!!!
在一个大型项目中:
文件1有一静态全局函数句柄Ptr,在Foo_Init()函数中得以初始化然后指向一个合法的内存地址,并且该句柄在以后被文件1的其他过程所调用。
文件2声明了两个大型的静态全局数组,大小为40960,随后在某一过程中进行两个数组之间的memcpy操作(该过程第一次调用时,目标数组基本全被赋值为0)。
现象是:
文件1的静态函数句柄Ptr,其所指向的内存单元,竟然被文件2的那一过程的memcpy操作清空,也就是说,该句柄Ptr本来指向的合法内存单元现在成了指向内存0x00000000!!纵使在跟踪过程中偶尔几次没有改变句柄指向的内存单元,也在随后的过程调用中会在memcpy操作中改变。我在跟踪过程中,很清晰的看到,在memcpy的汇编代码中的"REP MOVSB"指令一执行,句柄Ptr所指向的单元立刻被更改为0。
我实在非常困惑,既然它们都是静态的全局变量,在编译期间就应当被分配给合理的内存值,怎么会造成内存的覆盖呢?事实上,在某次运行中,我看到句柄Ptr本身的地址为0x00d6dafc,被赋值的数组的开始地址为0x00de3ddc,纵使加上数组的大小40960,也不会造成地址冲突啊!
没有办法,我只好希望将句柄Ptr改成为在堆中分配的动态地址,可是如何做到呢?项目都是C实现的,文件1中要多次用到句柄Ptr,而动态分配的地址(malloc)在某一函数调用完后便被释放,我还是没法在全局变量区中储存句柄Ptr被初始化后指向的内存单元。
大家能告诉我:
1 为何会出现内存地址被覆盖的现象?
2 如何用动态内存来储存一个要在其他多个过程中使用的内存地址?
谢谢了!!