前言
最早接触到new
这个关键字,是在 java 中,然后 es6 之后的 js 中也提供了 new 这个关键字,在 java 和 js 这两门语言中,使用 new 关键词可以实例化类的对象。语义是相似的,但是其背后还是有些差异的,js 的 new 和 class 可能是一些语法糖。
那么有了这些对 new 这个关键字用法的了解,我们今天来看一看 c++ 中提供 new 这个关键字的用途和用法。
我们都知道 c++ 一门效率和性能为先的语言,选择 c++ 来开发应用多数考虑性能才选择这门语言来开发应用程序。 c++允许我们在运行时为一个变量或一个数组分配内存。这就是的动态内存分配。在 java 和 js 这样语言中,编译器都是内存分配和回收机制,开发人员不用为内存管理而花费时间和精力。但是在 c++ 这门语言这大不一样,一切都是程序员自己思考,如何分配内存以及在适当时机将其回收。
那么今天要聊的new
和delete
操作符就是用来动态地分配和回收内存。
new 和 delete 的使用
new
int* ptr; ptr = new int; *ptr = 2; cout << *ptr << endl;
这里new
动态地获取一块大小为 int 类型大小的内存,然后将指向这块内存地址指针返回给ptr
这个我们之前定义好的用于存放int
类型大小的指针。
delete
随后我们用delete
来释放指针ptr
指向的内存。
delete ptr;
接下来我们通过 3 个小例子,分别介绍如何使用 new 和 delete 为基本类型、组数和对象来动态分配内存以及回收内存
float* pointfloat; pointfloat = new float; *pointfloat = 2.0f; cout << *pointfloat << endl;
为数组分配内存和释放内存
int main() { int num= 5; int* intpointer; intpointer = new int[num]; for (int i = 0; i < num; ++i) { cout << "level of tut: " << i + 1 << ": "; cin >> *(intpointer + i); } for (int i = 0; i < num; ++i) { cout << "level of tut" << i + 1 << ": " << *(intpointer + i) << endl; } delete[] intpointer; cout<<"hello world"; return 0; }
使用new
为 float 数组动态地分配了内存,返回指针是指向内存第一个元素的地址。
class tut { private: int level_; public: tut(int level):level_(level){} void printlevel(){ cout << "level: " << level_ << endl; } }; int main() { tut* ptr = new tut(2); ptr->printlevel(); delete ptr; cout<<"hello world"; return 0; }
注意箭头运算符->
,当通过指针访问类成员函数时候会用到->
。
那么new
主要做了什么事情,寻找合适大小内存,然后将指向内存地址的指针返回给你,注意这时new
不仅负责分配了tut
大小的内存,同时还调用了tut
的构造函数。
void* operator new(size_t size)
void operator delete(void*);
malloc 和 new
有时候我们通常可以用malloc
来分配内存,不过使用malloc
与使用new
有一定区别
class base { int val_; public: base() = default; base(int val):val_(val){} void print(){ cout << val_ << endl; } };
可以使用 malloc
分配sizeof(base)
base 类大小内存空间,那么new
操作符和malloc
其实通常都做了找到一块可以存放 base 类型数据大小内存,然后将内存地址返回,不同之处,new
除了作为分配内存的工作之外,还调用了一下够着函数。
base* base = new base();
base* base = (base*)malloc(sizeof(base));
base* base = new base(1); base->print();
delete 和 delete[]
使用关键字 new 在堆上开辟一块内存用于存放 base 类型大小的数据,因为 c++ 没有像 java 那样的垃圾回收机制,所以需要手动将这块内存释放。
delete base;
这里值得提一下,就是delete
和delete[]
是 2 个不同的操作符,所以我们释放数组时候需要选择delete[]
而不是delete
。
int* arr_ptr = new int[20]; delete[] arr_ptr;
到此这篇关于 c++ new 和 delete 关键字详解的文章就介绍到这了,更多相关 c++ new 和 delete 内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多c/c++开发分享 C++ new 和 delete 关键字详解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1237357.html