内存堆栈的奇怪现象
来源:互联网 发布:人力资源 知乎 编辑:程序博客网 时间: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的地址相差较大,不过也可以接受
第三行是开了一个线程,在线程里输出的,这时发现栈地址反而超过了堆地址,到了大的地址去了。
经过多次实验基本是这种情况,因此猜想,在线程中开辟的堆栈地址,和主进程中的不太一样。而不管开了几个线程,都是这样分布的情况。所以在调试的时候,不能仅仅根据出错内存的地址定位到底是堆还是在栈上的,还是需要具体进行分析才行
阅读全文
0 0
- 内存堆栈的奇怪现象
- 求救!!!奇怪的现象!
- 奇怪的现象
- noskipws()的奇怪现象!
- 好奇怪的现象
- 奇怪的UNION现象
- java的奇怪现象
- 奇怪的现象
- 堆栈溢出 的现象,
- 关于Session的奇怪现象
- 关于Session的奇怪现象
- hql一个奇怪的现象
- windows的又一个奇怪现象
- process explorer的奇怪现象
- std::for_each()的奇怪现象
- ifstream一个奇怪的现象
- IOS 绘图的奇怪现象
- C++的一个奇怪现象
- M进制转10进制
- Linux网络编程
- 【C1】JavaScript是什么
- Hadoop集群搭建
- 16.springboot任务调度
- 内存堆栈的奇怪现象
- java -- StringBuffer、Arrays系统方法用法
- 第3条:用私有构造器或者枚举类型强化Singleton属性
- 【工具】这是一篇获取工具的帖子
- 第十四周项目1
- Mac下关于pygame安装的问题
- leetcode-216. Combination Sum III
- python matplotlib中显示中文问题
- 冒泡排序-c++代码实现