内存堆栈的奇怪现象


之前调试一个程序的时候,发现该程序运行较长的一段时间后崩溃,给出的错误是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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值