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;
}