• 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; // 不会有任何副作用
    
  • 相关阅读:
    gin & gorm学习笔记
    Redis 核心知识点归纳总结,从根上理解 Redis
    解读APS及其效益
    《opencv学习笔记》-- 直方图均衡化、图像直方图、直方图的计算和绘制、直方图对比、反向投影、模板匹配
    C++ vector的使用和简单模拟实现(超级详细!!!)
    使用 🧨 Diffusers 实现 ControlNet 高速推理
    对于PatchGAN的理解
    1022 D进制的A+B
    Android JobScheduler介绍
    【算法面试必刷Java版七】链表中环的入口结点
  • 原文地址:https://blog.csdn.net/weixin_74239923/article/details/139835931