C++ new delete操作符
//new delete操作符
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std; /*
1.new delete 操作符号 都是 c++的关键字 类似于 C语言中的 malloc()函数 free()函数 2.定义对象时,使用了new关键字,会为这个对象在堆上分配内存,不使用new 关键字会直接在栈上分配内存
new 关键字可以分配基础类型内存,数组类型内存,对象类型内存
对于基础类型内存和数组类型内存,new delete关键字的功能和 malloc free关键字的功能基本相同(可以互相替换)
但是对于对象类型内存,new delete关键字会比malloc free多一步操作 new 关键字会调用对象的构造函数 delete会调用对象的析构函数 而malloc 和free不会这么做
所以对象不要使用malloc和free 3.new 运算符动态分配堆内存
使用形式: 指针变量= new 类型(常量) ; 指针变量 = new 类型(表达式)
作用:从堆分配一块 “类型”大小的内存空间,返回该类型空间的首地址(这个跟 C#和 Java不一样) delete 运算符释放已分配的内存空间
使用形式: delete 指针变量; delete [] 指针变量(这个主要用来释放数组的) */ class Point{
public:
Point(int _x,int _y,int _z){
cout << "自定义的有参构造函数被调用了1" << endl;
x = _x;
y = _y;
z = _z;
}
~Point(){
cout << "自定义的析构函数被调用了3" << endl;
}
void GetNum(){
printf("pt的值是%d,%d,%d\n",x,y,z);
}
private:
int x;
int y;
int z;
}; //分配基本类型
void ProtectA(){
//new 基础类型---强调 返回的是指针 不是个普通变量
int *p1 = (int *)malloc(sizeof(int));
*p1 = ;
if (p1!=NULL)
{
free(p1);
}
//替换成delete 效果一样
/*if (p1!=NULL)
{
delete p1;
}*/ int *p2 = new int;
*p2 = ;
printf("p2所指向内存空间的值%d\n",*p2);
if (p2!=NULL)
{
delete p2;
}
//替换成free 效果一样
/*if (p2 != NULL)
{
free(p2);
}*/ //分配内存的同时初始化
int *p3 = new int();
printf("p3所指向内存空间的值%d\n", *p3);
if (p3!=NULL)
{
delete p3;
} } //分配数组
void ProtectB(){
//new 分配数组
int *parr = (int *)malloc(sizeof(int)*); // 相当于 int a[5]={0};
memset(parr,,sizeof(int)*);
parr[] = ;
*(parr + ) = ;
if (parr!=NULL)
{
free(parr);
}
//可以替换为 delete[]
/*if (parr != NULL)
{
delete[] parr;
}*/ int *parr2 = new int[]; //相当于 int a[5]={0};
memset(parr2, , sizeof(int)* );//还是可以调用memset()函数初始化
parr2[] = ;
*(parr2 + ) = ;
if (parr2 != NULL)
{
delete[] parr2;
}
//可以替换为free
/*if (parr2!=NULL)
{
free(parr2);
}*/
} void ProtectD(Point **pout/*out*/){
Point *temp = new Point(, , );
*pout = temp;
} //分配对象
void ProtectC(){
//必须用指针变量接受 new操作符的返回值
Point *p = new Point(,,);
p->GetNum();
if (p!=NULL)
{
delete p;
//避免野指针
p = NULL;
}
Point *p2 = NULL;
ProtectD(&p2);
if (p2 != NULL)
{
delete p2;
p2 = NULL;
} } void main(){
ProtectC(); system("pause");
}
C++ new delete操作符的更多相关文章
- Javascript的变量与delete操作符
原文:http://charlee.li/javascript-variables-and-delete-operator.html 刚刚看到一篇好文(原文链接), 对Javascript中的dele ...
- javascript之delete操作符
理解delete 理论 代码段的类型 执行上下文 活动对象 / 变量对象 属性的特性 内置属性与 DontDelete 未声明的赋值 Firebug的困惑 在eval中删除变量 浏览器兼容性 Geck ...
- C++ 重载new和delete操作符
原因: C++标准库提供的new和delete操作符,是一个通用实现,未针对具体对象做具体分析 存在分配器速度慢.小型对象空间浪费严重等问题,不适用于对效率和内存有限制的应用场景 好处: 灵活的内 ...
- 重载new delete操作符是怎么调用的
自定义的new操作符是怎么对英语new 一个对象的?自定义的delete操作符什么情况下得到调用?new一个对象时出现异常需要我操心内存泄露吗?下面的一个例子帮我们解开所有的疑惑. 1. 调用规则 ...
- C++之new和delete操作符
在C语言中的动态分配和释放内存的函数是malloc calloc 和 free , 而在C++中要用 new new[] delete delete[] 来申请动态空间和释放空间. 注意:的是new. ...
- 1.5 C++ new和delete操作符
参考:http://www.weixueyuan.net/view/6331.html 在C语言中,动态分配和释放内存的函数是malloc.calloc和free,而在C++语言中,new.new[] ...
- js delete 操作符
delete操作符很陌生,很少会用到,但是既然碰到了,就mark一下: delete 操作符用于删除一个对象的属性: 注意点:只能删除自己的属性,从原型链上继承的属性是无法删除的:
- js中的内部属性与delete操作符
本文正式地址:http://www.xiabingbao.com/javascript/2015/08/03/javascript-delete-configurable 在讲解Configurabl ...
- C++语言基础(2)-new和delete操作符
在C语言中,动态分配内存用 malloc() 函数,释放内存用 free() 函数.如下所示: ); //分配10个int型的内存空间 free(p); //释放内存 在C++中,这两个函数仍然可以使 ...
随机推荐
- nested exception is java.lang.IllegalStateException: Cannot forward after response has been committed
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...
- UML学习(一)-工具介绍
这里用于学习UML的工具是StarUML,没有什么原因为什么要用它,或许仅仅是有人说好用和比较小. 首先介绍下这个工具,来张图. 1.菜单栏(最上面) 2.快捷工具栏(菜单栏下面) 3.工具项(Too ...
- 【转发】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。
http://www.cnblogs.com/joey0210/archive/2012/09/29/2708420.html 上一篇文章说到了DLL引用问题,主要是说的程序中如果使用过了反射, ...
- 【apache】apache模拟高并发请求
目的:测试程序的性能 运用的工具是apache的ab工具,装有apache服务器的一般都有ab工具. lamp命令: ab -c 10 -n 100 "http://a.ilanni.com ...
- ubuntu13.04如何修改保存屏幕亮度
ubuntu13.04如何修改保存屏幕亮度 入手ubuntu两月有余,最初只是想装个ubuntu学习下linux,然后搞了个win7和ubuntu的双系统,最后干脆将win7干掉了,直接让ubu ...
- Linux下查看磁盘挂载的三种方法
Linux下查看磁盘挂载的三种方法 2009-06-05 23:17 好久没有更新日志了,呵呵.不是没有要写的东东.实在抽不出时间来写,要准备公司的考试呢,C++考试.已经有七个月没有写C++代码了, ...
- C#指南,重温基础,展望远方!(11)C#委托
委托类型表示对具有特定参数列表和返回类型的方法的引用. 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体. 委托类似于其他一些语言中的函数指针概念,但与函数指针不同的是,委托不仅面向对象,还 ...
- 会话过程保存数据对象cookie和session
1 cookie是以键值对保存在浏览器端,服务器端可以创建.接收.发送 cookie 信息. request可以接收 cookie, response 可以发送 cookie. 1)cookie 可以 ...
- mysql group replication 安装&配置详解
一.原起: 之前也有写过mysql-group-replication (mgr) 相关的文章.那时也没有什么特别的动力要写好它.主要是因为在 mysql-5.7.20 之前的版本的mgr都有着各种各 ...
- centos vsftp 500 OOPS: cannot change directory
CentO中把vsftpd安裝配置好了,以為大功告成,但用FTP 登入出現下錯誤:500 OOPS: cannot change directoryCentOS系統安裝了SELinux,因為預設下是沒 ...