由于工作的需要,所以最近在研究这方面的东西,所以想把自己的收获分享给大家,希望能给予你们星星之火。
在C++编程中,由于庞大的计算量,如果没有及时的释放所占内存,就无法将内存返还给自由存储区,这就成为Memory Leak(内存泄露)。内存泄露很难发现,一般需要程序运行一段时间后,耗尽内存空间时,内存泄露才会暴露出来。这时候如果程序要创建新的对象,系统将抛出名为bad_alloc的异常,所以及时的分配和释放资源是每一个开发者都不可避免的问题。
这篇博客主要是讲new和delete之动态创建对象的内存管理,既然是动态创建,所以必须就手动释放。
那么什么是动态创建对象呢?
通过New表达式在自由存储区中分配创建一个对象。
通过下面这两行代码,我们具体分析一下:
int i;
int * p = new int;
i,未初始化的int对象。p,通过new表达式创建了一个整型对象,并返回次对象的地址,并使用该地址初始化指针p。p就是动态创建的对象。
如何创建动态对象
string *ps=new string();<pre name="code" class="cpp">int *pi=new int();
cls *pc=new cls();
如何删除动态创建的对象
动态创建的对象用完后,程序员必须显示的释放该对象。使用delete释放指针所指向的地址空间。
delete pi
delete [] arr; //释放数组
下面我们看一下这个代码:
for (rsize_t ix = 0; ix != 1000000; ++ix){
char* pc2 = new char[len + 1]; // allocate the space
strcpy_s(pc2, len + 1, pc);
if (strcmp(pc2, pc))
;
delete[] pc2; // free the memory
}
string str("a very long literal string");
for (rsize_t ix = 0; ix != 1000000; ++ix){
string str2 = str; // do the copy, automatically allocated
if (str != str2)
;
} // str2 is automatically freed
为什么下面的那个for循环体内创建的string对象 str2不需要手动释放呢?因为他是自动分配的内存(区别于动态分配),因此当这个循环体结束,这个对象的生命周期就会结束,被C++自动释放掉。
那么问题就来了,在C++的代码中,我们怎样知道这个指针指向的内存是否已经被删除了,如果已经撤销,第二次删除的时候就会发生错误。操纵动态分配的内存时,很容易发生这个错误,那么怎么办呢?
1. 零值指针,一旦删除了指针指向的对象,立即将指针置为0,这样就明确表示指针不再指向任何对象
int *ptr=new int(1024);
delete ptr;
ptr=0;
这样在每次删除之前判断即可。
2. nullptr
nullptr在MSDN上定义是Windows平台上托管的C++/CLI,更多有关nullptr,请参考nullptr