C++的new和delete
一,new和delete:
(1)new是操作符,不是函数,malloc是函数。
(2)基本数据类型(int ,float,double,char),free, malloc, new,delete 效果一致。
(3)delete ,free对于基本数据类型,释放,释放两次都会出错。
(4)free之后,指针的值不会改变,delete之后,指针的值会改变(我的电脑上每次delete之后,指针的值变成了0000 8123),而free之后的指针的值没有改变,打印出来的是垃圾值。free之后,为了避免迷途指针,最好将指针设置为空指针(nullptr)。
(5)如果是基本数据类型 new 是不会调用构造函数,delete 时不会调用析构函数。
如果是结构类型,new会调用构造函数,delete会调用析构函数。
(6)基本数据类型 数组,delete,delete[]一致;基本数据类型,可以互相混合使用。
(7)复合数据类型(delete ,delete[]不能混合使用)
例如:mydata *p(new mydata); delete p;
mydata *p(new mydata[10]); delete[] p;
(8)单个堆上的对象,不可以用delete [],反复delete,下面delet代码是错误,只用能delete p,不能用delete [] p.
mydata *p(new mydata);
delete [ ] p;//单个堆上的对象,不可以用 delete [],用delete[]程序会报错
#include<iostream> using namespace std;void main2() {int *p1 = new int(4);//指向一个变量int *p2 = new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };//指向数组delete p1;//delete p1 int *p1 = new int(4);delete[] p2;//delete[] p2 int *p2 = new int[10]{ 1,2,3,4,5,6,7,8,9,0 }; cin.get(); } //数组new和初始化 void main3() {int *p = new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };cout << p << endl;cout << "--------------" << endl;delete[] p;cin.get(); } //基本数据类型new及初始化 void main4() {int *p1 = new int(4);cout << p1 << endl;cout << "--------------" << endl;delete p1;//delete[] p1;cin.get(); } class mydata { public:mydata() //构造函数 {cout << "create" << endl;}~mydata()//析构函数 {cout << "delete" << endl;} };void main() {mydata *p(new mydata);delete p;//mydata *p(new mydata);//delete []p;//单个堆上的对象,不可以 delete [],反复deletemydata *p(new mydata[10]);delete []p;//异常cin.get(); }
#include <iostream> #include <new>using namespace std;const int BUF = 512; const int N = 5; char buffer[BUF];int main() {double *p1, *p2;cout << "calling new and placement new " << endl;p1 = new double[N];p2 = new (buffer) double[N];for (int i = 0; i < N; i++){p2[i] = p1[i] = 1000 + 10.0*i;}cout << "heap:"<<p1<< " static:"<<(void*)buffer << endl;cout << "memory contents:" << endl;for (int i = 0; i < N;i++){cout <<" p1 "<< p1[i] << " at " << &p1[i] << "; ";cout << " p2 "<<p2[i] << " at " << &p2[i] << endl;}cout << " " << endl;cout << "calling new and placement new a second time" << endl;double *p3, *p4;p3 = new double[N];p4 = new (buffer) double[N];//重写数据for (int i = 0; i < N; i++){p4[i] = p3[i] = 1000 + 50.0*i;}cout << "memory contents:" << endl;for (int i = 0; i < N; i++){cout << "p3 "<<p3[i] << " at " << &p3[i] << "; ";cout << "p4 " << p4[i] << " at " << &p4[i] << endl;}cout << " " << endl;cout << "calling new and placement new a third time" << endl;delete [] p1;p1 = new double[N];p2 = new(buffer + N*sizeof(double)) double[N];for (int i = 0; i < N; i++){p2[i] = p1[i] = 1000 + 70.0*i;}cout << "memory contents:" << endl;for (int i = 0; i < N; i++){cout <<"p1 "<< p1[i] << " at " << &p1[i] << "; ";cout << "p2"<<p2[i] << " at " << &p2[i] << endl;}delete[]p1;delete[]p3;cin.get();return 0; }
运行结果:
calling new and placement new heap:007AB2F8 static:01380320 memory contents:p1 1000 at 007AB2F8; p2 1000 at 01380320p1 1010 at 007AB300; p2 1010 at 01380328p1 1020 at 007AB308; p2 1020 at 01380330p1 1030 at 007AB310; p2 1030 at 01380338p1 1040 at 007AB318; p2 1040 at 01380340calling new and placement new a second time memory contents: p3 1000 at 007AB500; p4 1000 at 01380320 p3 1050 at 007AB508; p4 1050 at 01380328 p3 1100 at 007AB510; p4 1100 at 01380330 p3 1150 at 007AB518; p4 1150 at 01380338 p3 1200 at 007AB520; p4 1200 at 01380340calling new and placement new a third time memory contents: p1 1000 at 007AB2F8; p21000 at 01380348 p1 1070 at 007AB300; p21070 at 01380350 p1 1140 at 007AB308; p21140 at 01380358 p1 1210 at 007AB310; p21210 at 01380360 p1 1280 at 007AB318; p21280 at 01380368
定位new运算符,将p2放在了数组buffer中,p2和buffer的地址都是01380320;然而他们的类型不同,p2是double的指针,buffer是char的指针。所以用void*对buffer进行类型转换,不然buffer打印出来的是一个字符。
最后,不能直接delete [ ] p2,由于buffer指定的是内存的静态内存,而delete只能释放堆区的分配的内存。
转载于:https://www.cnblogs.com/wangpfcnblogs/p/4604311.html
C++的new和delete相关推荐
- Reject: HTTP ‘DELETE‘ is not allowed, Not injecting HSTS.....DELETE请求PUT请求跨域问题
CORS(DELETE请求.PUT请求) Reject: HTTP 'DELETE' is not allowed [DEBUG] 2021-08-25 15:23:52.401 [http-nio- ...
- Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)
1. git remote add--添加远程仓库 在GitHub 上创建的仓库路径为 "git@github.com:用户名/git-tutorial.git".现在我们用git ...
- C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)
1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...
- C++:随笔6---new\delete\虚方法\抽象方法
指针是一种专门用来存储内存地址的数据类型.(他存储的不是具体的数据而是别人的地址) 常用做法是:创建一个变量,再把这个变量的地址赋值给一个指针,然后就可以用指针去访问这个变量的值. 事实上在C和C++ ...
- C++中的new和delete用法
//个体 point *p=new point; //point类存在初始化成员函数point(void)的前提下才能这样赋值: delete p;//一维数组,这样赋值的话,p在程序里表示的就不是指 ...
- LeetCode刷题记录3——237. Delete Node in a Linked List(easy)
LeetCode刷题记录3--237. Delete Node in a Linked List(easy) 目录 LeetCode刷题记录3--237. Delete Node in a Linke ...
- 在析构函数中delete this指针问题
思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...
- LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化
文章目录 前言 1. 问题背景 2. 问题复现 3. Rocksdb 的 Delete-Aware 优化 3.1 可配置的 Delete-Aware调度 3.2 Compaction 逻辑对 dele ...
- leetcode 237: Delete Node in a Linked List
题目: Write a function to delete a node (except the tail) in a singly linked list, given only access t ...
- 【C++】C/C++ 中default/delete特性
C++类的特殊成员函数及default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https://www.geeksforgeeks.org 目录 目录 C++类的特殊成员函数及def ...
最新文章
- Windows的端口列表(转载)
- DOS批处理高级教程精选(六)
- Summer Plan(挖坑待填)
- C/C++中static关键字详解
- 在vue-cli生成的项目中使用karma+chrome进行单元测试
- 2021年7月【RHCE考试战报】他们都在提升,你还在吃鸡王者吗?
- mpython_mPython
- 物联卡可以持续使用的时间有多久?
- My.Ioc 代码示例——如何使用默认构造参数,以及如何覆盖默认构造参数
- AMOS分析技术(导航页)
- cs61b实验记录(一)Lab2、Lab3
- Python 高斯列主元消去法求增广矩阵/方程组的解 Numpy模块
- ps_图片大小精准裁剪
- AE效果器(Effect)开发
- coffeescript java 执行_coffeescript 运行原理
- android自动连接wifi,Android自动连接WiFi优先级规则,以及查看已连接WiFi的密码
- 第一章、基于Ruoyi-Vue开发脚手架之对象存储实现
- Android利用自定义View实现简单的足球战术板
- EOF while reading packet
- centos8.2+Tesla T4搭建深度学习运行环境
热门文章
- 【ES6(2015)】RegExp
- 信息安全工程师笔记-网络安全测评技术与标准
- C++工作笔记-对'xxxxx'未定义的引用的2种情况
- C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)
- Java基础入门笔记-使用变量并打印
- 专业课程设计之客户与服务器程序的同步与通信机制的设计(二)TCP通信
- php判断绝对路径文件是否存在,php – 如何确定文件路径是否绝对?
- java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则
- asf linux教程,ASF V3.0 windows/linux含树莓派部署流程
- nginx 防止恶意域名解析_配置nginx只允许域名访问,禁止ip访问【图文教程】