c++指针,内存分配回收相关

177 阅读2分钟

指针

指针是一个变量,用于存储另一个变量的内存地址。通过指针,可以间接访问和操作存储在该地址上的数据。

指针的定义时候,它必须指向一个地址.这个地址可以是某个数组的起始地址,也可以是某个变量的地址.注意区分指针定义与解引用的概念.

int value = 42;
// 定义方式1, 将变量的地址赋值给指针
int* ptr = &value;

// 定义方式2, 将数组地址(起始地址) 赋值给指针
int* ptr2 = new int[10];

指针通俗的理解就是有一个变量,他的值存储的是一个地址.该地址指向的内存是同一种类型(对象). 我们一般用指针来操作数组. 但指针并不是只能操作数组. 例如:变量a(int)的地址是:0x1000,变量b(int)的地址:0x1004,指针指ptr指向a的地址. 那么将指针进行+1然后解引用,就是变量b了.*(++ptr) .数组在内存中是连续的.所以指针操作数组最为常见.

基础概念:

  1. windows中,地址的单位是byte. int 占用4字节. 包括malloc分配的单位也是byte,一般操作系统的单位都是byte.
  2. windows内存是小端序
  3. 在代码中: *是解引用,int* 是声明指针.&是取地址.int& 是声明引用类型

形参类型为指针,传递的是指针的值(指针指向对象的地址); 类型为引用类型,传递的是地址. 本质上都是地址.只是指针是地址的值,引用对象是对象的地址. 形参为对象,传递是是拷贝值.

指针传参可以为nullptr ,引用类型不能为空指针.

内存的申请与回收

在栈上申请的内存,会随着局部方法的结束,自动释放.在堆上分配的内存,需要回收.

#include <iostream>

int main() {
    int* ptr = new int; // 动态分配内存
    *ptr = 42;

    std::cout << *ptr << std::endl; // 输出 42

    delete ptr; // 释放内存
    ptr = nullptr; // 避免悬空指针
    return 0;
}

malloc 分配内存

#include <iostream>
#include <cstdlib> // 包含 malloc 和 free 的声明

int main() {
    int* ptr = (int*)malloc(sizeof(int)); // 分配一个 int 的内存

    if (ptr == nullptr) { // 检查分配是否成功
        std::cerr << "Memory allocation failed!" << std::endl;
        return 1;
    }

    *ptr = 42; // 初始化内存
    std::cout << *ptr << std::endl; // 输出 42

    free(ptr); // 释放内存
    return 0;
}