内存堆栈的奇怪现象

来源:互联网 发布:人力资源 知乎 编辑:程序博客网 时间:2024/05/19 06:18


之前调试一个程序的时候,发现该程序运行较长的一段时间后崩溃,给出的错误是doublie linked corrupted。

一般出现这种情况都是内存越界,对同一个部分的内存重复释放之类导致的,但是我出现这个时候,debug显示的堆栈是operator new,malloc之类的,让我百思不得其解。

另外根据调试器给出的信息,发现出错时使用的内存为7fffxxxxxxxx,从显示的内存分布来开,堆(heap)在3c0000附近,栈在7fffffffffff附近,就是说堆从小往大增长,栈反过来。所以感觉这里可能是栈溢出,或者是有谁破坏栈了。但是也没有找到具体的地方。为此在windows下做了个实验,看看堆栈在内存里的分布究竟是什么样的。回头再贴在linux下的结果

基本的代码如下

DWORD WINAPI test(LPVOID pCtx){char tmp1[1024];char *tmp2 = new char[1024];char *tmp3 = (char*)malloc(1024);INT nStackValue(0);MEMORY_BASIC_INFORMATION mi = {0};DWORD dwRet = VirtualQuery(&nStackValue, &mi, sizeof(mi));printf("thread ----stack %p, heap %p, %p \n", tmp1, tmp2, tmp3);return 0;}int main(int argc, char** argv){char tmp1[1024];char *tmp2 = new char[1024];char *tmp3 = (char*)malloc(1024);INT nStackValue(0);MEMORY_BASIC_INFORMATION mi = {0};DWORD dwRet = VirtualQuery(&nStackValue, &mi, sizeof(mi));printf("0----stack %p, heap %p, %p \n", tmp1, tmp2, tmp3);test(0);CreateThread(NULL, 0, test, NULL, 0, NULL);}

而程序输出的结果如图

第一行在main里输出的,感觉在windows栈地址在小,堆地址在大。第二行是调用的函数,发现malloc出来的地址距离new的地址相差较大,不过也可以接受

第三行是开了一个线程,在线程里输出的,这时发现栈地址反而超过了堆地址,到了大的地址去了。

经过多次实验基本是这种情况,因此猜想,在线程中开辟的堆栈地址,和主进程中的不太一样。而不管开了几个线程,都是这样分布的情况。所以在调试的时候,不能仅仅根据出错内存的地址定位到底是堆还是在栈上的,还是需要具体进行分析才行


原创粉丝点击