C++动态内存分配问题

动态内存分配问题

动态内存分配问题:c中供程序使用的储存空间,有程序区,静态储存区,动态储存区。

c++中,我们把内存进一步详细分为5个区域;

(1)栈:一般函数内的局部函数都会放在这里,由编译器自动分和释放。

(2)堆:程序员malloc/new分配,用free/delete来释放。忘记释放后,程序结束系统会自动回收

(3)全局/静态存储区:放全局变量和静态变量static。程序结束时系统释放

(4)常量存储区:"i love you";

(5)程序代码区

堆和栈不同的用途和区别

(1)栈空间有限的,这是系统自动分配的, int a = 4,分配速度快,程序员也控制不了

(2)堆:只要不超出实际拥有的物理内存,也在操作系统允许你能够分配的最大内存大小之内,都可以分配给你,分配速度比栈慢,好处是灵活,随时用new/malloc分配,用free/delete释放。

//在C语言中,用malloc和free从堆中分配和释放内存
​
void *malloc(int NumBytes);//NumBytes:要分配的字节数
​
//分配成功返回分配的地址指针,分配失败返回NULL
​
//当这段分配的内存你不使用时,应该用free释放掉供其他地方使用
​
void free(void *FirstByte)//将之前用malloc分配的内存空间还给程序(操作系统),也就是说释放了这块内存,被系统回收,并在需要时由系统分配给其他地方
 int * p = NULL;
p = (int *)malloc(sizeof(int));//把从堆中分配的四个字节强转为int *类型
if(p != NULL) {
    //分配成功
    *p = 5;
    cout << *p <<endl;
    free(p);//完成任务后释放
}
​
char * point = NULL;
point = (char*)malloc(100 * sizeof(char));
if(point != NULL)
{
    //strcpy(point, "hello world");这种会有内存溢出的风险,而且不会警告
    strcpy_s(point, 100, "hello world");//中间100表示有一百个字节可以分配,若拷贝的内容大于100个字节就会报错
    //strcat----strcat_s升级版(字符串拼接)
    cout << point <<endl;
    free(point);
}
​
int *p = (int*)malloc(sizeof(int)*100);//分配可以放得下100个整数的内存空间
if(p != NULL)
{
    int *p = q;
    *q++ = 1;//赋值1
    *q++ = 5;//对第二个int空间赋值5
    cout<< *p<< endl;//1
    cout<<*(p+1)<<endl;//5
    free(p);
}

new和delete:是运算符(标识符),c++中就用new/delete分配和释放内存,不再使用malloc和free来分配和释放内存

new,delete也和malloc,free干了一样的事就是分配和释放内存,同时也做了更多的事,在new出一个新对象时还会调用对象的构造函数,但是malloc就不会,所以在c++中一定要使用new和delete取代malloc和free

new一般使用格式:

(1) 指针变量名 = new 类型标识符;

(2) 指针类型名 = new 类型标识符(初始值);//注意这里圆括号括起来,表示初始值

(3) 指针类型名 = new 类型标识符 [内存单元个数] //注意这里是[ ]

int * myint = new int;
if(myint != NULL)
{
    *myint = 8;
    cout << *myint <<endl;
    delete myint;//释放单个myint空间
}
​
int * myint = new int(18);//分配4个字节的内存空间,同时赋初值为18
if(myint != NULL)
{
    cout << *myint <<endl;//18
    delete myint;//释放单个myint空间
}
​
​
int * myint = new int[100];//开辟了一个大小为100的整形的数组空间
if(myint != NULL)
{
    int * q = myint;
    *q++ = 12;
    *q++ = 18;//执行完这句q已经指向下表为2的int空间
    cout << *myint <<endl;//第一个int空间 12
    cout << *(myint++) << endl;//第二个int空间 18
    delete[] myint;//释放整个myint空间,注意这种格式
    //new的时候我们用[],那么delete的时候我们必须用[],[]不写数组大小
}

额外补充知识

(1)配对使用有malloc成功必然有free,有new成功必然有delete;

(2)free/delete,不要重复调用;

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值