C++内存管理之new和delete

来源:互联网 发布:淘宝处罚考试答案 编辑:程序博客网 时间:2024/05/16 03:27

由于工作的需要,所以最近在研究这方面的东西,所以想把自己的收获分享给大家,希望能给予你们星星之火。

在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 pidelete [] arr; //释放数组

下面我们看一下这个代码:

for (rsize_t ix = 0; ix != 1000000; ++ix){char* pc2 = new char[len + 1];      // allocate the spacestrcpy_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 allocatedif (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

0 0