标准C++程序设计学习笔记(六)——★C++动态内存

目录

动态内存

★new/delete 和 malloc/free的区别?


动态内存

  • C动态内存: malloc/calloc/realloc/free sbrk/brk mmap/munmap

  • C++动态内存:new/delete 底层调用的是C语言的函数

  • 数据类型* 指针变量 = new 数据类型; //自动初始化为“零”

    数据类型* 指针变量 = new 数据类型(初始值);

    delete 指针变量;
     

    #include <iostream>    //26new.cpp
    using namespace std;
    
    
    int main(){
    	int *p = new int;//new一个int类型的内存空间
    	cout << *p << endl;
    	*p = 1024;
    	cout << p << endl;
    	cout << *p << endl;
    
    	delete p;//释放动态内存
    
    	double *pd = new double;
    	cout << *pd << endl;
    	*pd = 3.14159;
    	cout << pd << endl;
    	cout << *pd << endl;
    	delete pd;
    	
    	p = new int(1024);
    	cout << p << endl;
    	cout << *p << endl;
    	delete p;
    
    	pd = new double(6.666);
    	cout << pd << endl;
    	cout << *pd << endl;
    
    	return 0;	
    }
    

  • new[]/delete[] 用来对数组进行内存申请/释放
    #include <iostream>    //27newarr.cpp
    using namespace std;
    
    
    int main(){
    	int *p = new int[10]{111,222,1024};//申请10个int类型的内存地址
    	for(int i=0;i<10;i++){
    		cout << p[i] << " ";	
    	}
    	cout << endl;
    	
    	for(int i=0;i<10;i++){
    		p[i] = i;	
    	}
    	for(int i=0;i<10;i++){
    		cout << p[i] << " ";	
    	}
    	cout << endl;
    
    	delete[] p;
    
    	return 0;	
    }
    

    ★new/delete 和 malloc/free的区别?

  •  new/delete是C++的操作符,new可以重载
     malloc和free是C语言标准库中的函数

  •  new在申请动态内存时,不需要自己计算内存大小,是按照数据类型进行分配
     malloc在申请动态内存时,需要指定内存大小,是按照指定的大小进行分配

  •  new会调用类的构造函数,且申请的动态内存不会有垃圾值

     malloc不会调用类的构造函数

  •  delete在释放动态内存时,会调用类的析构函数
     free不会调用类的析构函数

  •  malloc出错时,会返回NULL并且设置errno

     new出错时,则抛出bad_malloc的异常

  •  malloc返回值类型为void*,所以malloc的返回值通常都需要进行类型转化

     new返回值类型为 new的数据类型的指针

  •  new申请数组内存时需要用new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],   delete[]多次调用析构函数,销毁数组中的每个对象

     malloc可以直接申请数组内存,只能sizeof(int) * n。

  • malloc分配的内存不够时,可以用realloc扩容
    new不需要这样的操作

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值