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
- C++内存管理之new和delete
- 动态管理内存之new和delete
- 内存管理:new和delete
- new和delete管理内存
- C++动态内存管理之深入探究new和delete
- 【C++】动态内存管理(new,delete,new[],delete[])
- C++内存管理基础之new & delete
- C++内存管理基础之new & delete
- C++内存管理基础之new & delete
- C++内存管理基础之new & delete
- C++ -- 内存管理 之 重载new delete
- 实例详解new和delete 内存管理
- 内存管理 new、delete’
- C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)
- 从java到C++——new和delete的动态内存管理
- 【C++】动态内存管理(一)成对使用new和delete时要采取相同形式
- 动态内存管理---new&delete
- 动态内存管理new&delete
- 在Java中获得当前Java进程的PID
- 如何设置span的width属性
- __init__.py在包里的作用
- 让editText不自动获得焦点
- 将Emacs配置成一个C/C++的IDE编程环境
- C++内存管理之new和delete
- Spring ContextLoaderListener源码分析 .
- Android Fragment 基本介绍
- java.util.concurrent介绍
- UVA699 The Falling Leaves【二叉树】【递归】
- 向苹果App Store提交新应用的图文教程
- 遇到女神应该使用什么样的暗恋思维
- Xcode编程问题小结1
- 8051的结构和原理 /8051到底是哈佛结构还是冯诺伊曼结构