C++对象数组调用带参数的构造函数 new delete

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的部分行为。

猜你喜欢

转载自blog.csdn.net/jadeshu/article/details/105499753