范围 for,new 内存动态分配,nullptr

范围 for,new 内存动态分配,nullptr

范围 for

int main()
{
    int arr[] = {11, 12, 13, 14, 15};
    for (auto x : arr){ //  问题所在:需要将 arr 中的每一个都拷贝到 x 中去 ===> 节省拷贝的方法:使用指针,提升效率
        cout << x << endl;
    }
    cout << "===============================" << endl;
    //  改进
    for (auto &x : arr){ // 省了拷贝这个动作,提高了系统效率
        cout << x << endl;
    }
    return 0;
}

new 内存动态分配

C中 供程序使用的存储空间:程序区,静态存储区,动态存储区
C++ 中,我们把区域进一步分为5个区域:

  1. 栈:一般函数内的局部变量都会放在这里,由编译器自动分配和释放
  2. 堆:程序员 malloc / new 分配,用 free /delete 来释放。忘记释放后,系统会回收
  3. 全局/静态存储区:放全局变量和静态变量 static。程序结束时系统释放
  4. 常量存储区:"I Love China"
  5. 程序代码区

堆和栈的区别:

  1. 栈:空间是有限的,这是系统 int a = 4; 分配速度快,程序员控制不了
  2. 堆:只要不超出你实际的物理内存,也在操作系统允许你能够分配的最大内存大小 之内,都可以分配给你,分配速度1比栈慢,你可以随时使用 new / malloc 来分配,free / delete 来释放,非常灵活。

malloc 和 free:在 C 语言中,用 malloc 和 free 从堆中来分配和释放内存用。malloc 和 free 是函数

//  返回类型是:void * ===> 万能的类型指针(指向什么东西都行,可以被强制转换成任何其它类型指针)
//  - 分配成功:返回指向被分配内存的指针
//  - 分配失败:则返回 NULL
void *malloc(int NumBytes);  //  NumBytes:要分配的字节数
//  当这段分配的内存你不使用的时候,你应该用 free() 函数来将内存释放掉,供其它地方使用
void free(void *FirstByte); 

C 语言例子

int main()
{
    int *p = NULL;
    p = (int *)malloc(sizeof(int)); //  在堆中分配 4个字节
    if (p != NULL) {
        //  分配成功
        *p = 5;
        cout << *p << endl;
        free(p); // 释放掉,千万不要忘记
    }
    char *point = NULL;
    point = (char *)malloc(100 * sizeof(char)); //  100个位置
    if (point) {
        strcpy(point, "hello world!!!");
        cout << point << endl;
    }
    return 0;
}

再看 C++ 的 new 和 delete

int main()
{
    //  new 和 delete:是运算符(标识符)
    //  C++ 中就用 new / delete 分配和释放内存,不再使用 malloc 和 free 来分配和释放内存
    
    //  new 一般使用格式
    //  1. 指针变量名 = new 类型标识符
    //  2. 指针类型名 = new 类型标识符(初始值)  
    //  3. 指针类型名 = new 类型标识符[内存单元个数]
    int *myInt1 = new int;
    if (myInt1)
    {
        *myInt1 = 8;
        cout << *myInt1 << endl;
        delete myInt1;   //  释放
    }

    int *myInt2 = new int(18);  //  给个初始值
    if (myInt2)
    {
        cout << *myInt2 << endl;
        delete myInt2;
    }

    int *myInt3 = new int[100];  //  开辟一个大小为 100 的整型数组空间
    if (myInt3)
    {
        int *p = myInt3;
        *p++ = 11;  //  [0] = 11;
        *p++ = 13;  //  [1] = 13; 执行完后,这个 p 其实已经指向 [2]
        cout << *myInt3 << endl;
        cout << *(myInt3 + 1) << endl;
        //  释放内存
        delete[] myInt3;    //  释放 int myInt3 数组空间
                            //  new 时候我们用 [],那么 delete 就必须用 [],并且 [] 不写数组大小
    }
    return 0;
}

nullptr(C++11 中引入的新关键字)

引入这个:是为了避免和 NULL 混淆

  • NULL 本质为:0,可以这样定义:int b = NULL
  • 而 nullptr 却不可以这样用

NULL 和 nullptr 实际上是不同的类型
结论:对于指针的初始化,尽量用 nullptr

posted @ 2024-09-16 19:04  爱新觉罗LQ  阅读(3)  评论(0编辑  收藏  举报