标签:
void *operator new(size_t); //allocate an object void *operator delete(void *); //free an object void *operator new[](size_t); //allocate an array void *operator delete[](void *); //free an array
这是在c++11 new中对这几个函数的定义,平时可直接使用,但再次主意new[]分配的只能通过delete[]来释放,如果用delete的话这只能释放掉数组的第一项,后边的还是存在的。因为数组的地址就是数组第一项的地址。所以new[]的一定要用delete[]来释放。
#include<stdio.h> #include<stdlib.h> #include<Windows.h> char*ch[1000]; int size = 20000; int main() { int i, j; for (int i = 0; i < 1000; i++) ch[i] = (char*)malloc(sizeof(char)*size); for (i = 0; i < 1000;i++)//换入内存,如不进行操作,glibc并不会真正的向系统申请内存 for (j = 0; i < size; j++) ch[i][j] = ‘ ‘; Sleep(20000);//在此期间查看内存使用情况 for (i = 0; i < 1000; i++) free(ch[i]); Sleep(20000);//再次查看内存使用情况 return 0; }
实验发现,free前与free后的内存使用情况是相同,并没有因为free而空闲出很多内存。而当程序跑完最后的return 0;之后内存使用率才真正的降下来。此时程序涉及到的内存才真正的被完全释放。所以答案是free并没有真正释放内存,相关内存块储存的东西仍然在,而free与delete的过程只是切断了指针与内存块的联系,这块内存本身在没有其他的数据对其进行修改的时候一直都储存着其原来的东西。有其他的内存分配需求的时候这块内存很可能就被分配过去了,然后谁想怎么改就怎么改(就类似于优盘格式化后不向里边写入新东西,原来的东西还是存在的一样)(如果分配到的内存特别特别大的话,free后有可能内存使用率直接降下来,这与操作系统内存管理有关)
标签:
原文地址:http://www.cnblogs.com/freedom314/p/5027896.html