C++分配数组调用带参数的构造函数
#include <iostream>
using namespace std;
class CStudent
{
public:
CStudent(int num):age(num){}
int age;
};
int main(int argc, char const *argv[])
{
cout << "=========方法一=========" << endl;
CStudent *s[100];
for (int i = 0; i < 100; ++i)
{
// new对象
s[i] = new CStudent(50);
}
cout << s[99]->age << endl;
cout << s[10]->age << endl;
cout << s[0]->age << endl;
cout << "=========方法二=========" << endl;
// 先分配堆内存
CStudent * pStudent = (CStudent*)operator new(100*sizeof(CStudent));
for ( int i = 0; i < 100; ++i )
{
// 调用构造函数
new (pStudent+i) CStudent(50);
}
cout << pStudent[99].age << endl;
cout << pStudent[10].age << endl;
cout << pStudent[0].age << endl;
return 0;
}
1. new分为两步
a、内存分配
调用相应的operator new( )分配内存
b、构造函数
调用相应的构造函数
2.placement new
可以分配指定堆、栈、静态区的现有内存。
堆区可以delete操作,但栈和静态区不可以delete操作
#include <iostream>
using namespace std;
// 静态区
//char *context[1024]{ 0 };
int main()
{
// 使用静态区内存
//int *p = new (context) int[5]{ 1,2,3,4,5 };
//delete[] p; //erro
// 使用堆区内存
char *context = new char[1024]{ 0 };
int *p = new (context+20) int[5]{ 1,2,3,4,5 };
delete[] p; //ok 释放所有的内存空间
// 使用栈区内存
//char *context[1024]{ 0 };
//int *p = new (context) int[5]{ 1,2,3,4,5 };
//delete[] p; //erro
return 0;
}
3、::new与new
在全局命名空间中有一个自带的、隐藏的operator new专门用来分配内存。默认情况下编译器会将new这个关键字翻译成这个operator new和相应的构造函数。
但在有的情况下,用户自己会在类中重载operator new,这种情况下,编译器默认会使用类中重载的operator new(本质上因为编译器会从命名空间由内而外查找自己想要的函数,选用第一个)。
如果我们想要继续使用默认的operator new,就应该写成::new 字面意思就是调用最外层命名空间中的operator new
值得一提的是最外层的(也是默认的)operator new也是可以被重载的。通过这种方式我们可以改变所有new的部分行为。