
前言最早接触到new这个关键字是在 Java 中然后 ES6 之后的 js 中也提供了 new 这个关键字在 java 和 js 这两门语言中使用 new 关键词可以实例化类的对象。语义是相似的但是其背后还是有些差异的js 的 new 和 class 可能是一些语法糖。那么有了这些对 new 这个关键字用法的了解我们今天来看一看 c 中提供 new 这个关键字的用途和用法。我们都知道 c 一门效率和性能为先的语言选择 c 来开发应用多数考虑性能才选择这门语言来开发应用程序。 C允许我们在运行时为一个变量或一个数组分配内存。这就是的动态内存分配。在 java 和 js 这样语言中编译器都是内存分配和回收机制开发人员不用为内存管理而花费时间和精力。但是在 c 这门语言这大不一样一切都是程序员自己思考如何分配内存以及在适当时机将其回收。那么今天要聊的new和delete操作符就是用来动态地分配和回收内存。new 和 delete 的使用new1234int* ptr;ptr newint;*ptr 2;cout *ptr endl;这里new动态地获取一块大小为 int 类型大小的内存然后将指向这块内存地址指针返回给ptr这个我们之前定义好的用于存放int类型大小的指针。delete随后我们用delete来释放指针ptr指向的内存。1deleteptr;接下来我们通过 3 个小例子分别介绍如何使用 new 和 delete 为基本类型、组数和对象来动态分配内存以及回收内存1234float* pointFloat;pointFloat newfloat;*pointFloat 2.0f;cout *pointFloat endl;为数组分配内存和释放内存12345678910111213141516intmain(){intnum 5;int* intPointer;intPointer newint[num];for(inti 0; i num; i) {cout level of tut: i 1 : ;cin *(intPointer i);}for(inti 0; i num; i) {cout level of tut i 1 : *(intPointer i) endl;}delete[] intPointer;coutHello World;return0;}使用new为 float 数组动态地分配了内存返回指针是指向内存第一个元素的地址。12345678910111213141516171819classTut{private:intlevel_;public:Tut(intlevel):level_(level){}voidprintLevel(){cout level: level_ endl;}};intmain(){Tut* ptr newTut(2);ptr-printLevel();deleteptr;coutHello World;return0;}注意箭头运算符-,当通过指针访问类成员函数时候会用到-。那么new主要做了什么事情寻找合适大小内存然后将指向内存地址的指针返回给你注意这时new不仅负责分配了Tut大小的内存同时还调用了Tut的构造函数。1void* operatornew(size_tsize)1voidoperatordelete(void*);malloc 和 new有时候我们通常可以用malloc来分配内存不过使用malloc与使用new有一定区别1234567891011classBase{intval_;public:Base() default;Base(intval):val_(val){}voidprint(){cout val_ endl;}};可以使用malloc分配sizeof(Base)Base 类大小内存空间那么new操作符和malloc其实通常都做了找到一块可以存放 Base 类型数据大小内存然后将内存地址返回不同之处new除了作为分配内存的工作之外还调用了一下够着函数。1Base* base newBase();1Base* base (Base*)malloc(sizeof(Base));12Base* base newBase(1);base-print();delete 和 delete[]使用关键字 new 在堆上开辟一块内存用于存放 Base 类型大小的数据因为 c 没有像 Java 那样的垃圾回收机制所以需要手动将这块内存释放。1deletebase;这里值得提一下就是delete和delete[]是 2 个不同的操作符所以我们释放数组时候需要选择delete[]而不是delete。12int* arr_ptr newint[20];delete[] arr_ptr;到此这篇关于 C new 和 delete 关键字详解的文章就介绍到这了