本文关于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。