c++内存管理3: new handler、=default、=delete函数
1、new_handler
new_handler位于头文件< new >中
当new无法成功申请内存,在抛出异常之前,new会调用一个系统默认或用户指定的错误处理函数,也就是这里的new_handler。我们可以通过set_new_handler来设置我们的错误处理函数。
2、 =default
一般地,编译器会默认为一个类生成:
默认构造函数:X()
拷贝拷贝构造函数:X(const X &)
拷贝赋值运算符:X& operator(const X&)
移动构造函数:X(x&&)
析构函数:~X()
如果用户自定义了其中部分或全部,则编译器不再生成对应的。
函数 = default明确地告诉编译器,自己不生成这些中的一些或全部,由编译器来生成。
使用默认构造函数,使用默认析构函数
3、=delete函数
定义一个类的成员函数时,如果后面使用"=delete"去修饰,那么就表示这个函数被定义为deleted,也就意味着这个成员函数不能再被调用,否则就会出错。
在C++11之前,当我们希望一个类不能被拷贝,就会把构造函数定义为private,但是在C++11里就不需要这样做了,只需要在构造函数后面加上=delete来修饰下就可以了。
第二个应用就是避免出现隐式转换
void func(int data) { printf("data: %d\n", data); }
void func(double data)=delete;
当使用func(100.0),为避免发生隐式转换而去使用第一个函数,那么就标明没有对应double这个参数的函数,也就是不会让其使用