美文网首页
c++ new用法

c++ new用法

作者: 海角hust | 来源:发表于2020-05-07 21:22 被阅读0次

    本文关于c++的基础用法和高级用法

    1.基础用法

    int *a = new int[5];
    class A {...}   //声明一个类 A
    A *obj = new A();  //使用 new 创建对象
    delete []a;
    delete obj;
    

    new A()进行了如下操作:
    (1) 在堆上分配了存储空间
    (2) 调用A的构造函数(这是与malloc的主要区别,malloc只分配空间,没有调用构造函数)

    delete obj的时候,调用A的析构函数,并释放存储空间,这也是与free的主要区别

    2.operator new

    C++ 规定 new 的 这 两个功能分开实现
    (1)分配空间: 调用函数 operator new 来实现。
    (2)调用构造函数: 调用 placement new 来实现。
    这三个 new ,第一个new就是我们常说的new,这个new调用接下来的两个new来实现它的功能。 (这个 new 为 new operator)

    new关键字会调用 operator new 分配空间: 这里 operator new 是一个全局的函数,写在一个文件中。当使用 new 关键字 的时候,编译器会自动找到这个函数,并且调用这个函数:这个函数的声明如下:

    // 全局 operator new
    void * operator new(std::size_t size) throw(std::bad_alloc) {
        if (size == 0)
            size = 1;
        void* p;
        while ((p = ::malloc(size)) == 0) { //采用 malloc 分配空间
            std::new_handler nh = std::get_new_handler();
            if (nh)
                nh();
            else
                throw std::bad_alloc();
        }
        return p;
    }
    // 对应的全局 operator delete 采用 free 释放空间
    void operator delete(void* ptr) {
        if (ptr)
            ::free(ptr); //采用 free 释放空间。
    }
    

    operator new分配了相关的存储空间,类似与malloc,需要调用构造函数创建对象,就需要placement new

    3.placement new

    placement new的功能就是调用构造函数,创建对象

    class A {...}  //声明一个 类 A
    void *buf =  malloc(sizeof(A));   //简单地分配空间。
    A *ojb = new (buf)A();    // 在分配的空间上调用构造函数。
    

    “已经分配好的空间” 可以是任何的空间,比如说 可以是栈上的空间!

    class A {int a;}
    int buf[sizeof(A)];   //在栈上,分配一个数组
    A *obj =  new(buf) A();  //在这个数组上构造一个 对象 A。
    

    相关文章

      网友评论

          本文标题:c++ new用法

          本文链接:https://www.haomeiwen.com/subject/cavzghtx.html