iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ new 和 delete 关键字详解
  • 104
分享到

C++ new 和 delete 关键字详解

2024-04-02 19:04:59 104人浏览 薄情痞子
摘要

目录前言new 和 delete 的使用newdelete为数组分配内存和释放内存malloc 和 newdelete 和 delete[]前言 最早接触到new这个关键字,是在 J

前言

最早接触到new这个关键字,是在 Java 中,然后 es6 之后的 js 中也提供了 new 这个关键字,在 java 和 js 这两门语言中,使用 new 关键词可以实例化类的对象。语义是相似的,但是其背后还是有些差异的,js 的 new 和 class 可能是一些语法糖。

那么有了这些对 new 这个关键字用法的了解,我们今天来看一看 c++ 中提供 new 这个关键字的用途和用法。

我们都知道 c++ 一门效率和性能为先的语言,选择 c++ 来开发应用多数考虑性能才选择这门语言来开发应用程序。 C++允许我们在运行时为一个变量或一个数组分配内存。这就是的动态内存分配。在 java 和 js 这样语言中,编译器都是内存分配和回收机制,开发人员不用为内存管理而花费时间和精力。但是在 c++ 这门语言这大不一样,一切都是程序员自己思考,如何分配内存以及在适当时机将其回收。

那么今天要聊的newdelete操作符就是用来动态地分配和回收内存。

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;

这里值得提一下,就是deletedelete[]是 2 个不同的操作符,所以我们释放数组时候需要选择delete[]而不是delete

int* arr_ptr = new int[20];
delete[] arr_ptr;

到此这篇关于 C++ new 和 delete 关键字详解的文章就介绍到这了,更多相关 C++ new 和 delete 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ new 和 delete 关键字详解

本文链接: https://www.lsjlt.com/news/153053.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ new 和 delete 关键字详解
    目录前言new 和 delete 的使用newdelete为数组分配内存和释放内存malloc 和 newdelete 和 delete[]前言 最早接触到new这个关键字,是在 J...
    99+
    2024-04-02
  • C++的new和delete详解
    目录1、new和delete的内部实现2、placement技术3、new和delete运算符重载4、对象的自动删除技术1、new和delete的内部实现 C++中如果要在堆内存中创...
    99+
    2024-04-02
  • C++ 动态内存分配详解(new/new[]和delete/delete[])
    一、为什么需要动态内存分配? 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于...
    99+
    2024-04-02
  • C++的new和delete使用示例详解
    目录1. new 和 delete 三种 new2. operator new 和 operator delete3. 重载 operator new 和 operator...
    99+
    2022-12-08
    C++ new和delete使用 C++ new delete
  • C++中new和delete匹配使用过程详解
    目录一、new和delete的使用二、operator new和operator delete函数三、new和delete的实现原理四、申请空间和释放空间应配套使用五、定位new表达...
    99+
    2023-02-14
    C++ new与delete C++ new与delete的使用
  • C++ new和delete操作符
    在C语言中,动态分配内存用 malloc() 函数,释放内存用 free() 函数。如下所示:int *p = (int*) malloc( sizeof(int) * ...
    99+
    2023-06-03
  • c++动态内存管理详解(new/delete)
    目录前言用法上对内置类型对自定义类型new/delete底层原理重载类的专属operator new和 operator delete定位newnew/delete与malloc/f...
    99+
    2024-04-02
  • C++关键字之likely和unlikely详解
    目录什么是likely和unlikelylikely/unlikely的原理likely/unlikely的适用条件C++20中的likely/unlikely什么是likely和u...
    99+
    2022-11-13
    C++ likely和unlikely C++ likely和unlikely
  • 深入理解C语言的new[]和delete[]
    目录1、重载操作符2、new和delete的原理3、new[]和delete[]的原理总结c++的动态内存管理方式和c语言不一样,在c++中使用new和delete来替换c语言中的m...
    99+
    2024-04-02
  • C#中的const和readonly关键字详解
    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1、声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student ...
    99+
    2022-11-13
    C# const关键字 readonly关键字
  • c++中的volatile和variant关键字详解
    目录一、两个长得有点像的变量二、二者的功能三、应用实例四、总结一、两个长得有点像的变量 对volatile关键字,其实很多人只是能用,知道用到啥处,但其实应用的原理并不知道。在一些多...
    99+
    2024-04-02
  • c++中new和delete怎么使用
    在C++中,new和delete是用来动态分配和释放内存的操作符。1. 使用new操作符动态分配内存:```int* p = new...
    99+
    2023-09-27
    c++
  • c++中的new和delete怎么用
    小编给大家分享一下c++中的new和delete怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!new expressionnew一个类型,会创建一个该类型的...
    99+
    2023-06-22
  • 一篇文章了解c++中的new和delete
    目录new expressiondelete expressionnew[]和new()new[]和delete[]new的内存分布placement newnew失败处理捕捉异常禁...
    99+
    2024-04-02
  • C++深入讲解new与deleted关键字的使用
    目录可执行程序的虚拟地址空间1.new的运算符用法(关键字)2.new的函数用法3.定位new4.new创建对象5.delete6.对于内置类型new/delete/malloc/f...
    99+
    2024-04-02
  • C/C++中的static关键字详解
    目录C/C++ 中的 static1. 静态局部变量2. 静态全局变量3. static 修饰函数C++的 static 成员静态成员变量 静态成员函数总结:static是...
    99+
    2024-04-02
  • C++中new与deleted关键字如何使用
    今天小编给大家分享一下C++中new与deleted关键字如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。可执行程序的...
    99+
    2023-06-30
  • C#中 New关键字的作用是什么
    C#中 New关键字的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、在C#中,new这个关键字使用频率非常高,主要有3个功能:1)作为运算符用来创建一个对象和调用...
    99+
    2023-06-17
  • C++ Explicit关键字详细解析
    explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用...
    99+
    2022-11-15
    Explicit 关键字
  • C++中的explicit关键字详解
    目录前言1. 抑制构造函数定义的隐式转换2. 为转换显式地使用构造函数3. 类型转换运算符可能产生意外结果4. 显示的类型转换运算符5. explicit练习5.1 当不使用expl...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作