C++的动态内存

C语言中申请动态内存:
malloc/calloc/realloc/free
Linux中申请动态内存:
brk/sbrk -> mmap/munmap
C++中申请动态内存:
new/delete

1.动态内存的申请

new/delete是两个运算符 用于申请/释放 单个单位长度的内存空间;
new用于申请动态内存;
new 类型名; new不需要告诉编译器申请多大的内存,编译器拿到类型之后就能确定申请几个字节;
用new申请的动态内存自动初始化为 "零";
new 类型名(初始值); 这样申请的动态内存里面就已经有初始值;
delete用于释放动态内存;
new和delete底层实现是malloc/free;

#include <iostream>
using namespace std;

int main(){
	int *p = new int;
	cout << *p << endl;
	delete p;	
	
	int *p1 = new int(1000);
	cout << *p1 << endl;
	delete p1;

	double *pd = new double(3.14);
	cout << *pd << endl;
	delete pd;
	//cout << *pd << endl;

	char *pc = new char('a');
	cout << *pc << endl;
	
	delete pc;

	return 0;	
}

2、申请单位长度的内存空间

new[]/delete[] 用来申请/释放 多个 单位长度的内存空间 数组
new 类型名[长度]; 申请 长度 个 sizeof(类型) 大小的内存空间 自动初始化 “零”
new 类型名[长度]{v1,v2,…}; 申请动态内存,并且用{}中的值初始化动态内存
delete[] 指针; 释放动态内存

#include <iostream>
using namespace std;

int main(){
	int *p = new int[10];//申请10个int类型大小的内存空间
	for(int i=0;i<10;i++){
		cout << p[i] << " ";	
	}
	cout << endl;
	p[0] = 1;
	p[1] = 2;
	for(int i=0;i<10;i++){
		*(p+i) = i*i;	
	}
	for(int i=0;i<10;i++){
		cout << p[i] << endl;	
	}

	delete[] p;
	
	p = new int[5]{1,2,3,4,5};
	for(int i=0;i<5;i++){
		cout << p[i] << " ";
	}
	cout << endl;
	delete[] p;

	p = new int(101);
	delete p;
	
	return 0;	
}

3、 new/delete和malloc/free的区别?

(1) new/delete是C++的运算符,malloc/free是C语言中标准库的函数 都是用于申请/释放动态内存
(2) new分配内存时不需要字节大小,通过类型计算得到;而malloc需要传递申请动态内存的大小
(3) new返回的特定的指定类型,malloc返回 void *
(4) new/delete会调用构造和析构函数 ; malloc/free不会调用构造和析构函数

4、练习:

.把100以内的质数存储到动态内存中

#include <iostream>
using namespace std;

int main(){
	int *p = new int[40];
	int num = 0;
	for(int i=2;i<100;i++){
		bool is = true;
		for(int j=2;j<i;j++){
			if(i%j==0){
				is = false;
				break;
			}	
		}
		if(is){
			p[num++] = i;	
		}
	}
	for(int i=0;i<num;i++){
		cout << p[i] << " ";	
	}
	cout << endl;
	delete[] p;	
	return 0;	
}
发布了53 篇原创文章 · 获赞 18 · 访问量 7256

猜你喜欢

转载自blog.csdn.net/Nire_Yeyu/article/details/100711181