Date:
2014-1-5

Summary:

C++中的动态内存创建与释放(这里就只记录C++中的new和delete了,其他的C风格操作就略过了)

单独记录new和delete的原因是为了学习时候关注点更清晰

Contents:
1.new操作符

new操作符的作用是:找到一块长度正确的内存块,把该内存块的地址返回(所以我们需要一个指针用于接收new返回的内存地址,以便之后我们对该内存空间进行访问)

2.delete操作符

delete操作符的作用是:释放动new操作符创建出来的内存空间

a).delete是释放内存,而不是释放指针

b).delete不能用于释放那些通过声明获得的内存

3.new[]与delete[]

new[]用于动态创建数组,对应的使用delete[]来释放数组

Notes:

1.C++允许在一个函数中创建内存(new),在另外一个函数中释放它(delete)。即通过new创建的内存的生命周期直到对其调用delete时才结束.

2.不要用delete来释放不是new分配的内存.

3.不要用delete释放同一块内存两次.

4.使用new[]分配的内存,要使用delete[]释放.

5.对空指针进行delete是安全的.

6.防止野指针导致程序错误.

7.delete的释放对象是内存,而不是指针.

EX:

   //
// main.cpp
// Cpp_All_Test
//
// Created by StephenLee on 1/1/14.
// Copyright (c) 2014 StephenLee. All rights reserved.
// // a).
// 使用new操作符创建一块大小能容纳一个int的内存块,使用指针p接收new操作符返回的内存块地址
int* p = new int(10);
(*p) += 1;
cout << "通过指针p访问动态创建的内存空间" << (*p) << endl; // 如果此时使p指向新的内存空间,那么之前创建的空间就无法被找到,它将一直存在于程序的整个生命周期中,这就造成内存泄露
p = new int(20);
cout << "忘了释放p所指向的内存,又把p指向新的内存,程序不会crash,但是造成了内存泄露:" << (*p) << endl; //使用完毕之后记得用delete释放new创建出的内存
delete p; // b).
// 不要过渡释放
// delete p; //程序Crash,p指向的空间已经被释放过 //此时p指向的内存已经被释放,但是p指针依然有值,它是一个野指针
if(p)
{
// 程序会执行到此处
// 我们通过delete告诉编译器,此块内存我已经用完了,还给你
// 但是系统不一定立刻重新使用此块内存,所以此块内存的值还以为是存在,但是它绝对不是"安全"的
} // c).
// 所以通常在delete指针指向的空间之后,需要把指针设为空指针 , 防止野指针隐患
// delete p;
// p = NULL; // d).
// delete可以被用于空指针
p = NULL;
delete p; // ok // e).
// delete不能用来释放通过声明得到的内存
int num = 30;
p = #
// delete p; //程序Crash , 不能释放非new创建的内存 // f).
// new[] 与 delete[]
int* pArray = new int[10];
for (int i = 0; i<10; i++)
*(pArray+i) = i; for (int i=0; i<10; i++)
cout << "pArray[" << i << "]=" << *(pArray+i) << endl; delete [] pArray;
pArray = NULL;

  

THE END

[C++]new和delete的更多相关文章

  1. 如何区别数据库删除语句drop与delete与truncate?

    1.delete:删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行) 删除某一行:delete from 数据表名称 where 列名称=值: 删除所有行:delete*fro ...

  2. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  3. 关于JavaScript中的delete操作

    关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...

  4. Git异常:Cannot delete the branch 'test1' which you are currently on

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  5. HTTP Method详细解读(`GET` `HEAD` `POST` `OPTIONS` `PUT` `DELETE` `TRACE` `CONNECT`)

    前言 HTTP Method的历史: HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这三个方法 HTTP 1.1 这个版本是当前版本,包含GET HE ...

  6. IIS7.5上的REST服务的Put,Delete操作发生HTTP Error 405.0 - Method Not Allowed 解决方法

    WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...

  7. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法

    原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...

  8. new/delete重载

    在c++中,有时我们需要在运行阶段为一个变量分配未命名的内存,并使用指针来访问它,这里就可以用到new关键字.另外需要指出的是,new分配的内存块通常与常规变量分配的内存块不同,常规变量的值都储存在被 ...

  9. EC笔记:第三部分:16成对使用new和delete

    我们都知道,申请的资源,使用完毕后要释放.但是这个释放动作,一定要注意. 举个例子,很多人动态分配的资源,在使用之后,往往直接调用了delete,而不管申请资源的时候用的是new还是new[]. 如下 ...

  10. Spring boot: Request method 'DELETE' not supported, Request method 'PUT' not supported, Request method 'POST' not supported

    GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 一定是前端发送的rest 请求和后端的响应不匹配, 查找原因以及解决办法, 很简单 用chrome打开F12控制台 ...

随机推荐

  1. Silk Icons —— 再来 700 个免费小图标

    http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NzM0MjcyMQ==&appmsgid=10000977&itemidx=2&am ...

  2. Android imageView图片按比例缩放

    android:scaleType可控制图片的缩放方式,示例代码如下: <ImageView android:id="@+id/img" android:src=" ...

  3. Revit 2015 API 的全部变化和新功能

    这里从SDK的文章中摘录出全部的API变化.主要是希望用户用搜索引擎时能找到相关信息: Major changes and renovations to the Revit API APIchange ...

  4. Service的开启和停止以及生命周期

    1.清单文件 <service android:name=".TestService"></service> 2.开启Service Intent inte ...

  5. Eclipse用法和技巧二十八:Eclipse插件Easy Explore的今世

    先说明一下easyexplore插件的功能,easyexplore是一个类似于 Windows Explorer的Eclipse插件,它可以帮助你在不退出Eclipse的环境下迅速浏览本地文件系统. ...

  6. MVCC浅析(转)

    在并发读写数据库时,读操作可能会不一致的数据(脏读).为了避免这种情况,需要实现数据库的并发访问控制,最简单的方式就是加锁访问.由于,加锁会将读写操作串行化,所以不会出现不一致的状态.但是,读操作会被 ...

  7. VC 为静态控件添加事件

    操作系统:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为静态控件添加事件,如:STATIC.Picture Control等等 有时候我们找到一个图片,为对话框背景添加 ...

  8. B树的实现与源代码二(删除源代码)

    int BTreeMaximum( BNode *x ) { if ( x->leaf ) { return x->key[x->size - 1]; } else { return ...

  9. ajax终结篇

    Ajax中post和get的区别 在ajax中有这个方法 xmlreq.open("post","servlet/MyServlet?time="+newDat ...

  10. Java--Eclipse关联Java源码

    打开Eclipse,Window->Preferences->Java 点Edit按钮后弹出: 点Source Attachment后弹出: 选择Java安装路径下的src.zip文件即可 ...