这篇要做一点改变,本来计划是怎么debug内存溢出,但由于内存溢出的方式各种各样,没有固定的debug方式,调试手段随机应变。所以这篇主要从内存分布来理解内存溢出问题,以及内存溢出可能造成的后果。
首先看看结构体的内存分布,代码如下:
#include <Windows.h>
struct SA
{
double dArray[2];
int t;
SA()
{
FillMemory(dArray, sizeof(double), 0x11);
FillMemory(dArray+1, sizeof(double), 0x22);
FillMemory(&t, sizeof(int), 0x33);
}
};
struct SB
{
double dArray[2];
SA* sa;
};
int main()
{
SA testa;
return testa.t;
}
上面的FillMemory主要是为了让它们的内存更容易区分,这个函数的作用就是在这块内存上填上对应的hex值。这个函数属于Windows标准库的,同样的还有ZeroMemory。
接下来通过内存窗口看看这个SA结构体的内存分布:
这样一看是不是很明了了,结构体的内存都是连续的,double占8字节,int占4字节。内存溢出实际上主要发生在对内存的直接操作上,也就是指针的使用。
下面我演示了一个数组访问越界的操作: