一,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();
}

二,定位new运算符:
定位new运算符是new运算符的一种变体。通常new是在堆区来开辟内存的,如果需要可以new还可以在栈区和静态区开辟空间。
要使用定位new运算符,要包含new头文件#include<new>。
#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相关推荐

  1. 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- ...

  2. Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)

    1. git remote add--添加远程仓库 在GitHub 上创建的仓库路径为 "git@github.com:用户名/git-tutorial.git".现在我们用git ...

  3. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  4. C++:随笔6---new\delete\虚方法\抽象方法

    指针是一种专门用来存储内存地址的数据类型.(他存储的不是具体的数据而是别人的地址) 常用做法是:创建一个变量,再把这个变量的地址赋值给一个指针,然后就可以用指针去访问这个变量的值. 事实上在C和C++ ...

  5. C++中的new和delete用法

    //个体 point *p=new point; //point类存在初始化成员函数point(void)的前提下才能这样赋值: delete p;//一维数组,这样赋值的话,p在程序里表示的就不是指 ...

  6. 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 ...

  7. 在析构函数中delete this指针问题

    思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...

  8. LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化

    文章目录 前言 1. 问题背景 2. 问题复现 3. Rocksdb 的 Delete-Aware 优化 3.1 可配置的 Delete-Aware调度 3.2 Compaction 逻辑对 dele ...

  9. 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 ...

  10. 【C++】C/C++ 中default/delete特性

    C++类的特殊成员函数及default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https://www.geeksforgeeks.org 目录 目录 C++类的特殊成员函数及def ...

最新文章

  1. Windows的端口列表(转载)
  2. DOS批处理高级教程精选(六)
  3. Summer Plan(挖坑待填)
  4. C/C++中static关键字详解
  5. 在vue-cli生成的项目中使用karma+chrome进行单元测试
  6. 2021年7月【RHCE考试战报】他们都在提升,你还在吃鸡王者吗?
  7. mpython_mPython
  8. 物联卡可以持续使用的时间有多久?
  9. My.Ioc 代码示例——如何使用默认构造参数,以及如何覆盖默认构造参数
  10. AMOS分析技术(导航页)
  11. cs61b实验记录(一)Lab2、Lab3
  12. Python 高斯列主元消去法求增广矩阵/方程组的解 Numpy模块
  13. ps_图片大小精准裁剪
  14. AE效果器(Effect)开发
  15. coffeescript java 执行_coffeescript 运行原理
  16. android自动连接wifi,Android自动连接WiFi优先级规则,以及查看已连接WiFi的密码
  17. 第一章、基于Ruoyi-Vue开发脚手架之对象存储实现
  18. Android利用自定义View实现简单的足球战术板
  19. EOF while reading packet
  20. centos8.2+Tesla T4搭建深度学习运行环境

热门文章

  1. 【ES6(2015)】RegExp
  2. 信息安全工程师笔记-网络安全测评技术与标准
  3. C++工作笔记-对'xxxxx'未定义的引用的2种情况
  4. C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)
  5. Java基础入门笔记-使用变量并打印
  6. 专业课程设计之客户与服务器程序的同步与通信机制的设计(二)TCP通信
  7. php判断绝对路径文件是否存在,php – 如何确定文件路径是否绝对?
  8. java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则
  9. asf linux教程,ASF V3.0 windows/linux含树莓派部署流程
  10. nginx 防止恶意域名解析_配置nginx只允许域名访问,禁止ip访问【图文教程】