浅谈new
一、new A与new A()的区别
#include <iostream>
using namespace std;
class A
{
public:
int x;
A(){
cout << "A构造函数被调用了" << endl;
}
~A(){
cout << "A析构函数被调用了" << endl;
}
};
int main()
{
A* a = new A();
cout << a->x << endl;
return 0;
}
A构造函数被调用了
-842150451
实例一
现象:实现构造函数,使用new(),构造函数被调用,未初始化变量
分析:使用new()调用了构造函数,但构造函数中没有初始化变量,所以变量为任意值
实例二
现象:未实现构造函数,使用new(),变量被初始化
分许:编译器自动生成构造函数,并实现变量的初始化
实例三
现象:未实现构造函数,使用new,未初始化变量
分析:编译器没有自动生成构造函数???
猜测:使用new()时,编译器会给没有构造函数的对象提供一个构造函数。而使用new,构造器不会给POD类型的类提供构造函数。简而言之,当类的类型为POD时,new,new()的区别在于编译器是否提供构造器。
注:POD是一个struct或者类,且不包含构造函数、析构函数以及虚函数。
二、new的功能
new主要有以下两个功能:
1、分配空间:调用函数operator new来实现
2、调用构造函数:调用placement new来实现
operator new函数调用了malloc()函数来分配空间
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。
操作二:
重载 operator new 和 placement new