当delete某个元素的时候,我们可以想,根据数据的类型,就能够判断需要释放的内存的大小。不过当delete是一个数组的时候,语法是 delete [] p; 并不需要提供数组的元组个数。那么编译器是如何得知这个信息的呢?
上网上搜了一圈,总结成一句话:肯定存在某个地方了,这个地方对程序员是透明的,而且每个编译器的实现不一样。有些帖子说,这个信息存放在被分配内存的“紧前面”,我写了下面的程序,在win7 + vs2008下面测试:
void VerifyMemorySize (void)
{
char *p = new char[128];
cout << (int)(*(p-4)) << endl;// the expected value is 128
delete [] p;
}
发现打印出来的数值似乎是随机的。所以以上说法不成立。后来又看到vs里面有个函数_msize可以获得指针指向内存的大小,函数原型如下:
size_t _msize(void *memblock);
写了一下代码,想debug进去看看。
void VerifyMemorySize (void)
{
char *p = new char[128];
int i = _msize(p);// 断点
cout << i<< endl;// the expected value is 128, yes it is!
delete [] p;
}
debug进入到这个函数
retval = (size_t)HeapSize(_crtheap, 0, pblock);
就没有源代码了。把_msize换成_msize_dbg也一样,没有源代码。
总结一下:
1. 编译器怎么知道指针指向存储空间的大小的,是它自己的事,它也不希望程序员知道,大家就别操心了。
2. 如果有个指针你不知道它只想对大内存,调用_msize,头文件是<malloc.h>。