MST

星途 面试题库

面试题:C++中指针与引用的区别及指针的内存释放

请阐述C++中指针和引用的主要区别。假设有一个通过`new`关键字创建的指针数组,如何正确释放其内存?请写出具体代码示例。
32.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

指针和引用的主要区别:

  1. 定义
    • 指针:指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。可以通过*运算符来访问指针所指向的变量。例如:int* ptr; 定义了一个指向 int 类型的指针。
    • 引用:引用是已存在变量的别名,一旦初始化后就不能再引用其他变量。定义时必须初始化。例如:int num = 10; int& ref = num; 定义了 num 的引用 ref
  2. 内存分配
    • 指针:指针本身需要占用内存空间,用于存储所指向变量的地址。在32位系统下,指针通常占用4个字节,在64位系统下通常占用8个字节。
    • 引用:引用本身不占用额外的内存空间,它只是被引用变量的别名。
  3. 可修改性
    • 指针:指针可以在初始化后重新指向其他变量。例如:int a = 10, b = 20; int* ptr = &a; ptr = &b;
    • 引用:引用一旦初始化后,就不能再引用其他变量。
  4. 空值
    • 指针:指针可以为空(nullptr,在C++11之前是NULL),表示不指向任何有效的内存地址。例如:int* ptr = nullptr;
    • 引用:引用必须始终指向一个有效的对象,不存在空引用。定义引用时必须初始化。
  5. 运算符
    • 指针:指针使用*运算符来访问所指向的变量,使用&运算符来获取指针变量本身的地址。
    • 引用:引用使用&运算符来声明,但在使用时就像使用被引用的变量一样,不需要额外的运算符来间接访问。

释放通过new关键字创建的指针数组的内存:

#include <iostream>

int main() {
    // 创建一个指针数组
    int* arr[5];
    for (int i = 0; i < 5; ++i) {
        arr[i] = new int(i);
    }

    // 释放指针数组中的每个指针所指向的内存
    for (int i = 0; i < 5; ++i) {
        delete arr[i];
    }

    return 0;
}

如果使用new[]创建数组,则需要使用delete[]来释放内存,示例如下:

#include <iostream>

int main() {
    // 创建一个指针数组
    int** arr = new int*[5];
    for (int i = 0; i < 5; ++i) {
        arr[i] = new int(i);
    }

    // 释放指针数组中的每个指针所指向的内存
    for (int i = 0; i < 5; ++i) {
        delete arr[i];
    }
    // 释放指针数组本身的内存
    delete[] arr;

    return 0;
}