• C++的动态内存分配


    • 使用new/delete操作符在堆中分配/释放内存
    	//使用new操作符在堆中分配内存
    	int* p1 = new int;
    	*p1 = 2234;
    	qDebug() << "数字是:" << *p1;
    	//使用delete操作符在堆中释放内存
    	delete p1;
    

    在这里插入图片描述

    • 在分配内存的同时初始化
    //在分配内存的时初始化
    	int* p2 = new int(100);
    	qDebug() << "数字是:" << *p2;
    	delete p2;
    

    在这里插入图片描述

    • 以数组方式new的也要以数组方式delete
    //给数组分配内存
    	int* p3 = new int[4]{ 1,2,4,6 };
    	//以数组方式new的也要以数组方式delete
    	qDebug() << "数字是:" << p3[0] << p3[1] << p3[2] << p3[3];
    	delete[]p3;
    

    在这里插入图片描述

    • 通过new操作符分配N维数组,返回N-1维数组指针
    //通过new操作符分配N维数组,返回N-1维数组指针
    	//二维数组 三行四列
    	int(*p34)[4] = new int[3][4]{
    		{1,2,3,4},
    		{5,6,7,8},
    		{9,10,11,12}
    	};
    	for (int i = 0; i < 3; i++)
    	{
    		for (int n = 0; n < 4; n++)
    		{
    			qDebug() << "数字是:" << p34[i][n];
    		}
    	}
    
    	//释放多维数组
    	delete[] p34;
    

    在这里插入图片描述

    • 定位分配
      • new (指针) 类型 (初值);
      • 在一个已分配的内存空间中创建对象
    	//内存定位分配
    	short buf[8];
    	//在一个已分配的内存空间中创建对象
    	int* p6 = new (buf) int(0x12345678);
    	qDebug() << "p6数字是:" << *p6;
    	qDebug() << "buf数字是:" << buf[0] << buf[1] ;
    

    在这里插入图片描述
    -内存分配失败,new操作符抛出bad_alloc异常

    	//内存分配失败,new操作符抛出bad_alloc异常
    	try
    	{
    		int* p5 = new int[0xFFFFFFFFF];
    	}
    	catch (exception& e)
    	{
    		qDebug() << "内存分配失败";
    	}
    
    • 不能通过delete操作符释放已释放过的内存
    	//在分配内存的时初始化
    	int* p2 = new int(100);
    	qDebug() << "数字是:" << *p2;
    	delete p2;
    
    	//不能通过delete操作符释放已释放过的内存
    	//delete p2;
    
    • delete野指针后果未定义,delete空指针安全
    // 动态分配内存
        int* ptr = new int(42);
    
        // 使用指针
        std::cout << "The value is: " << *ptr << std::endl;
    
        // 删除指针
        delete ptr;
        //如果仍然指向已经被释放的内存,此时ptr就是一个野指针
        ptr = nullptr; // 将指针设置为nullptr,避免成为野指针
    
        // 尝试再次删除指针(现在是安全的,因为ptr是nullptr)
        delete ptr; // 不会有任何副作用
    
  • 相关阅读:
    分布式 ID 生成系统 Leaf 的设计思路,源码解读
    现代电信交换【复习&上课时的习题】
    Python学习六
    RestCloud ETL 跨库数据聚合运算
    Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)
    spark在什么情况下会使用mapPartition
    Hadoop基础学习笔记
    5步带你玩转SpringBoot自定义自动配置那些知识点
    Golang Channel 详细原理和使用技巧
    shell 编程
  • 原文地址:https://blog.csdn.net/weixin_74239923/article/details/139835931