c++ new用法

2020-05-07  本文已影响0人  海角hust

本文关于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。
上一篇下一篇

猜你喜欢

热点阅读