c语言的动态内存申请-->由函数申请
malloc:不带初始化的;
calloc:带初始化的,初始化为0;
realloc:重新申请(在原内存的后面接着申请);
c++的动态内存申请-->由关键字申请
只有new(申请)和delete(释放)
~单个变量内存申请
~数组的动态内存申请
~结构体的动态内存申请
单个变量的内存申请
申请单个内存不做初始化
void testoneMemory(){
//申请一个整型变量的内存,不做初始化,让指针指向一个变量的内存
int*pInt=new int;
//申请完内存后,可以当变量来使用
*pInt=123;
cout<<*pInt<
ps:可以new其他类型,只要注意格式即可
void testoneMemory(){
//申请一个字符型变量的内存,不做初始化,让指针指向一个变量的内存
int*pChar=new char;
//申请完内存后,可以当变量来使用
*pChar='a';
cout<<*pInt<
申请单个内存并做了初始化
//用()可以给单个数据初始化
void testoneMemory(){
int*pInt=new int(124); //用()给当前申请的整型变量的内存初始化为124
cout<<*pInt<
单个变量的内存释放
delete pInt;
pInt=Nullpstr;//释放后置空即可
小知识:
如何申请一大串内存?
申请一串内存不做初始化
用一维数组方式申请
void testArrayMemory(){
//申请一段内存用一维数组方式申请
int*pInt=new[3]; //[]中代表长度,可以是常量、变量,只要是值就可以了
//'A'也可以,自动转换成65
delete pInt; //这样释放也可以,推荐用下行的方式增加可读性
delete pInt[];//用了[]代表当前这个变量是一段内存
pInt[]=pstr; //释放完后置空
}
小知识:
让用户输入也可以
int num=0;
cin>>num;
int* pInt=new int[num];
用字符串方式申请
#include//c语言的string
#include
using namespace std;
int main(){
char* pstr=new char[15]; //char* 不能直接赋值
strcpy(pstr,"i love you"); //处理字符串通常用拷贝的方式
//strcpy_s(pstr,15,"i love you"); 增强版
cout<
小知识:
char* 不能直接赋值,处理字符串尽量用strcpy的方式
"i love you"是指向常量区的内存,没有赋值到堆区上
#include//c语言的string
#include
using namespace std;
int main(){
char* pstr=new char[15]; //char* 不能直接赋值,这样写数据没有赋值到new char[15]上
pstr="i love you";
//解决方案:const char* pstr=new char[15];
cout<
new char[15](堆区)上没有任何数据,这段内存没有初始化,输出乱码
把pstr的指向改变了,不影响pstr申请的内存
#include
#include
using namespace std;
int main(){
const char* pstr=new char[15]; //pstr指向new char[15]
const char*pstr1=pstr; //pstr1指向pstr,指向同一块内存
pstr="i love you"; //pstr改为指向"i love you"
cout<
小知识:
释放有且只有两种方式:
delete 指针<----------->单个变量内存释放
delete[ ] 指针<--------->一段内存释放---->[ ]中不用填释放长度、不存在[ ][ ]的情况--->基本语法
~用一维数组方式申请一串内存并做了初始化
//用{ }可以给一段内存初始化,未初始化的参数默认为0
void testArrayMemory(){
//申请一段内存,用一维数组申请并初始化
int*pNum=new int[3]{1,2,3};
for(int i=0;i<3;i++){
cout<
~用字符串方式申请一串内存并做了初始化
//字符数组方式初始化
char* str=new char[20]{'A','B','C'};//未初始化的参数默认为0
cout<
结构体动态内存申请
struct Student //结构体
{
int age;
char* name; //char name[20];
};
void teststructMemory(){
//new一个对象
//结构体动态内存申请和整型变量动态内存申请类似 int* p=new int(23);
Student* pstu=new Student; //未学构造函数前,结构体只能用{ }初始化
}
结构体的内存申请并做了初始化
struct Student//定义一个结构体
{
int age;
const char* name;
void printstu() //成员函数
{
cout<
结构体申请内存时初始化修改出现会问题(由const导致的)
ps:建议结构体申请内存后再初始化
struct Student//定义一个结构体
{
int age;
const char* name;
void printstu() //成员函数
{
cout<name=new char[18];
strcpy(pstu->anme,"i love you");//报错 可以给它拷贝了一段内存,但不能修改
}
结构体的内存申请之后做初始化
struct Student//定义一个结构体
{
int age;
char* name;
void printstu() //成员函数
{
cout<age=19;
pstu->printstu();
}
(结构体里面有指针,要做2次申请,才能strcpy或者赋值)
struct Student//定义一个结构体
{
int age;
char* name;
void printstu() //成员函数
{
cout<name,20,"张三");
pstu->age=19;
pstu->printstu();
}
结构体的内存释放
先申请的,后释放
申请顺序和释放顺序相反
反过来会中断,出现内存的重复释放,pstu不存在,怎么释放pstu的name?
struct Student//定义一个结构体
{
int age;
char* name;
void printstu() //成员函数
{
cout<name,20,"张三");
pstu->age=19;
pstu->printstu();
delete[]pstu->name;
delete pstu;//1个结构体变量的内存释放
}



