目录
  • 前言
  • new 和 delete 的使用
    • new
    • delete
  • 为数组分配内存和释放内存
    • malloc 和 new
      • delete 和 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

        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;
        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。