流浪のwolf

卷帝

导航

C++第七节课 new开辟空间 delete释放空间

#include <iostream>

using namespace std;
// C中开辟空间的方式  所有的返回值 都是 void *
/// int * p = (int*)malloc(sizeof (int))
/// malloc 在堆上开辟空间并没有进行初始化
///
/// int* pa = (int*)calloc(1,sizeof (int));
/// calloc 在堆上开辟空间是有初始化的
/// 在原来的基础上 pa 再次开辟 10 个空间
///
/// int *pa1  = (int*)realloc(pa,sizeof(int)*10);
/// 原来空间的数据 拷贝一份 (pa)
/// realloc 在堆上开辟空间是有初始化的
/// 释放空间
/// free(p)
/// free(pa)
/// free(pa1)
/// 同一块堆区空间被多次释放会造成 doublefree 的现象,程序会异常终止
///
// C++中开辟空间的方式
/// C++中提供了关键字 new 来动态开辟空间 ,为了释放空间 提供了关键字delete 来释放空间
/// 堆上的空间手动申请,手动释放,不然就是内存泄露
/// 使用 new + 类型 [N] 动态开辟 N 个类型的空间
/// 如果是连续开辟空间要释放使用 delete [] 进行释放
/// 对于内置类型而言 new 相当于是 malloc delete 相当于是 free
/// 内置类型和自定义类型
/// 如果是自定义类型 new 代表两种含义,1. 开辟空间 2. 调用类中的构造函数进行初始化
///               delete 代表2中含义:调用类中的析构函数,释放空间
///
/// new 和 malloc 的联系
/// new 的底层就是使用 malloc 实现的
/// malloc 如果申请空间失败返回 Null
/// new 如果申请空间失败抛出异常 bad_alloc()
/// new 是按照类型开辟空间的 , 而 malloc 是按字节为单位开辟空间的
/// 对自定义的类型来说,new 不仅开辟空间 还会调用自定义类中的构造函数
/// delete 不经释放空间 还会先调用自定义类中的析构函数
int main()
{
    // new  开辟空间的方式是使用new按照类型直接开辟的空间
    // 同时,在内置类型的后面加上 () 表示编译器在括号取值初始化内置类型所开辟的内存中的值
    int *p = new int();

    // 动态连续开辟空间
    int* pb = new int[1024];  // 连续开辟空间并初始化
    int* pc = new int[1024]{1,2,3}; // 开辟空间并赋值 C++11的新语法

    // 使用 delete 释放已经开辟的空间
    delete p;
    delete [] pb;
    delete [] pc;
    cout << "Hello World!" << endl;
    return 0;











}

 

posted on 2024-03-02 22:10  流浪のwolf  阅读(31)  评论(0编辑  收藏  举报