`
cloudtech
  • 浏览: 4612986 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

【Q&A】delete (free)如何知道被删除的数组的元组个数?

 
阅读更多

当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>。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics