服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ new 和 delete 关键字详解

C++ new 和 delete 关键字详解

2023-02-15 16:36zidea C/C++

这篇文章主要介绍了 C++ new 和 delete 关键字详解,文章围绕主题展开new 和 delete 的使用方法的介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言

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

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

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

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

new 和 delete 的使用

new

?
1
2
3
4
int* ptr;
ptr = new int;
*ptr = 2;
cout << *ptr << endl;

这里new动态地获取一块大小为 int 类型大小的内存,然后将指向这块内存地址指针返回给ptr这个我们之前定义好的用于存放int类型大小的指针。

delete

随后我们用delete来释放指针ptr指向的内存。

?
1
delete ptr;

接下来我们通过 3 个小例子,分别介绍如何使用 new 和 delete 为基本类型、组数和对象来动态分配内存以及回收内存

?
1
2
3
4
float* pointFloat;
pointFloat = new float;
*pointFloat = 2.0f;
cout << *pointFloat << endl;

为数组分配内存和释放内存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 数组动态地分配了内存,返回指针是指向内存第一个元素的地址。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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的构造函数。

?
1
void* operator new(size_t size)
?
1
void operator delete(void*);

malloc 和 new

有时候我们通常可以用malloc来分配内存,不过使用malloc与使用new有一定区别

?
1
2
3
4
5
6
7
8
9
10
11
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除了作为分配内存的工作之外,还调用了一下够着函数。

?
1
Base* base = new Base();
?
1
Base* base = (Base*)malloc(sizeof(Base));
?
1
2
Base* base = new Base(1);
base->print();

delete 和 delete[]

使用关键字 new 在堆上开辟一块内存用于存放 Base 类型大小的数据,因为 c++ 没有像 Java 那样的垃圾回收机制,所以需要手动将这块内存释放。

?
1
delete base;

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

?
1
2
int* arr_ptr = new int[20];
delete[] arr_ptr;

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

原文链接:https://juejin.cn/post/7114558008411045919

延伸 · 阅读

精彩推荐
  • C/C++C++ atoi()函数用法案例详解

    C++ atoi()函数用法案例详解

    这篇文章主要介绍了C++ atoi()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    棉猴7662022-01-04
  • C/C++C语言编写基于TCP和UDP协议的Socket通信程序示例

    C语言编写基于TCP和UDP协议的Socket通信程序示例

    这篇文章主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下...

    陈仲阳07982021-03-27
  • C/C++MFC命名规则汇总

    MFC命名规则汇总

    这篇文章主要介绍了MFC命名规则,对于初学者而言需要牢固掌握这类规则,需要的朋友可以参考下...

    C语言程序设计10732021-01-23
  • C/C++C++中实现矩阵的加法和乘法实例

    C++中实现矩阵的加法和乘法实例

    这篇文章主要介绍了C++中实现矩阵的加法和乘法实例的相关资料,需要的朋友可以参考下...

    不见x的心5752021-05-06
  • C/C++对C语言中递归算法的深入解析

    对C语言中递归算法的深入解析

    C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数...

    C语言教程网3602020-12-17
  • C/C++Qt数据库应用之实现数据分组导出

    Qt数据库应用之实现数据分组导出

    这篇文章主要为大家详细介绍了如何利用Qt实现数据库数据分组导出,文中的示例代码讲解详细,对我们学习或工作有一定参考价值,需要的可以了解一下...

    feiyangqingyun10602022-12-21
  • C/C++详解C++设计模式编程中对状态模式的运用

    详解C++设计模式编程中对状态模式的运用

    这篇文章主要介绍了C++设计模式编程中对状态模式的运用,状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,需要的朋...

    mafuli0075942021-03-26
  • C/C++c语言程序设计文件操作方法示例(CreateFile和fopen)

    c语言程序设计文件操作方法示例(CreateFile和fopen)

    c主要的文件操作函数有:CreateFile,CloseHandle,ReadFile,WriteFile,SetFilePointer,GetFileSize。其中的读写操作是以字符为单位,获得文件大小也是以字符为单位。...

    C语言教程网10892021-01-11