在c++stl程序媛开发指南上看到一个getmem的例子
template <class T>
void getmem(T*& oldmem,int elems)
{
typedef int cntr;
const int csz = sizeof(cntr);
const int tsz = sizeof(T);
if (elems == 0)
{
free(&(((cntr*)oldmem)[-1]));
return;
}
T* p = oldmem;
cntr oldcount = 0;
if(p)
{
cntr* tmp = reinterpret_cast<cntr*>(p);
p = reinterpret_cast<T*>(--tmp);//向后移4位
oldcount = *(cntr*)p;
}
T*m = (T*)realloc(p,elems*tsz+csz);
if(m == 0)
{
cout << "ERROR!"<<endl;
exit(1);
}
*((cntr*)m) = elems;
const cntr increment = elems - oldcount;
if(increment > 0)
{
long startadr = (long)&(m[oldcount]);
startadr += csz;
memset((void*)startadr,0,increment*tsz);
}
oldmem = (T*)&(((cntr*)m)[1]);
}
中间的free(&(((cntr*)oldmem)[-1])) 乍一看是内存访问越界啊 太明显了 识字的人都看出来 那肯定人家写的对,我没明白为什么这样写而已。忽然怀疑自己是不是连数组都不懂,下标为-1的时候表示的不仅仅是访问数组开始的前一个内存,慌啊。。赶紧上网查啊
还是csdn上有个人提问 下面有个高手解答了。其实是没真正看懂程序的缘故,只揪着其中的这句话不放。通读程序,只要发现getmem返回的并不是realloc之后的内存的首地址,而是第二个地址就能理解为什么free(&(((cntr*)oldmem)[-1]))没有访问越界了。而且下标为-1好像就只能是访问数组头的前一个地址