C++ 比 C语言 增加的新特性 4 之 内存分配

1. 内存分配

1.1 面试题:

C语言里的malloc和free与C++里的new和delete有什么区别?

C语言:

malloc:用于动态内存分配

free:释放动态内存

C++:

new:用于动态内存的申请

delete:用于释放申请的动态内存

1)C语言中malloc和free适用于内置的数据类型,C++中的new和delete不仅适用于内置的数据类型,还适用于自定义的类型(类类型)

2)C语言中使用malloc时,需要进行强转,但C++使用new不需要强转

3)C语言中使用malloc申请空间时需要指定空间大小,但new不需要指定大小

4)C语言中的malloc是函数,而new不是函数,其实质就是一个操作符

5)C语言中的malloc申请空间时没有向空间中存放初始值,但new申请空间时可以存放初始化值

1.2 new和delete的使用:

new申请变量地址空间

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型;

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型;

释放申请的空间:

格式:

delete  标识符

例如:

delete  p;

例如
int   *  p  =  new   int  ;   //在堆区new了int大小的空间,并用指针变量p指向该空间

int    * p ;
p= new int; 


People类型
People   * people = new People ;  //申请People大小的空间,并用people指向该空间

例如:
	delete  p;

1.3 new申请空间时向空间存放初始值

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型(初始值);

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型(初始值);

例如:

int   *  p  =  new   int(50)  ;   //在堆区new了int大小的空间,并用指针变量p指向该空间,并且向空间中存放初始值50
	或
int    * p ;
p= new int(50); 

1.4 使用new开辟数组空间

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型 [ 数组的大小];

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型[ 数组的大小];

例如:

int   *  p  =  new   int[5]  ;   //在堆区new了5个int大小的空间,并用指针变量p指向该空间
	或
int    * p ;
p= new int[50]; 

1.5 new申请数组空间时存放初始值

格式:

数据类型(内置的数据类型和自定义的类型)   *   标识符  =   new   数据类型 [ 数组的大小]{初始值1,初始值2,........};

数据类型(内置的数据类型和自定义的类型)   *   标识符;

标识符  =   new   数据类型[ 数组的大小]{初始值1,初始值2,........};

例如:

int   *  p  =  new   int[5]{1,2,3,4,5}  ;   //在堆区new了5个int大小的空间,并用指针变量p指向该空间
	或
int    * p ;
p= new int[5]{1,2,3,4,5}; 

释放空间:

格式:

delete  [] 标识符;

例如:

delete  [] p;

1.6 例

#define _CRT_SECURE_NO_WARNINGS 1

#include "iostream"
using namespace std;

//动态开辟空间
int main()
{
	//不带初始值的动态开辟
	int* p = new int;
	*p = 20;
	cout << "p=" << *p << endl;//20


	//带初始值的动态开辟
	int* q = new int(30);
	cout << "q=" << *q << endl;//30

	//动态开辟数组(不带初始化值)
	int* p1 = new int[5];
	for (int i = 0; i < 5; i++) {
		p1[i] = i + 1;
	}
	for (int i = 0; i < 5; i++) {
		cout << "数组:" << p1[i] << endl;
	}

	cout << endl;

	//动态开辟数组(带初始化值)
	int* p2 = new int[5] {1, 2, 3, 4, 5};
	for (int i = 0; i < 5;i++) {
		cout << "数组:" << p2[i] << endl;
	}
	
	//释放
	delete p;
	delete q;
	delete[]p1;//释放数组空间
	delete[]p2;

	return 0;
}

C++ 比 C语言 增加的新特性 4 之 内存分配_第1张图片

2. 动态开辟

main3.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "iostream"
using namespace std;

//动态开辟空间

int main()
{
	//不带初始值的动态开辟
	int* p = new int;
	*p = 20;
	cout << "p=" << *p << endl;//20


	//带初始值的动态开辟
	int* q = new int(30);
	cout << "q=" << *q << endl;//30

	//动态开辟数组(不带初始化值)
	int* p1 = new int[5] {1, 2, 3, 4, 5};
	for (int i = 0; i < 5; i++) {
		p1[i] = i + 1;
	}
	for (int i = 0; i < 5; i++) {
		cout << "数组:" << p1[i] << endl;
	}

	cout << endl;

	//动态开辟数组(带初始化值)
	int* p2 = new int[5] {1, 2, 3, 4, 5};
	for (int i = 0; i < 5;i++) {
		cout << "数组:" << p2[i] << endl;
	}
	
	//释放
	delete p;
	delete q;
	delete[]p1;//释放数组空间
	delete[]p2;

	return 0;
}

3. C++里的作用域:

(1)局部作用域

数据存在于代码块内部的区域,称之为“局部作用域”,数据在当前代码块中有效,超出代码块的区域就失效

(2)全局作用域

数据存在于文件中即代码块的外部,称之为“全局作用域”,数据对于整个文件都是有效的

(3)命名空间作用域

是全局作用域的一部分,数据存在于命名空间中只对该空间有效,超出则无效

(4)类作用域

是全局作用域的一部分,数据存在于类中,只读该类是有效,超出则失效


 

你可能感兴趣的:(C++,c++,c语言,linux)