C++ 指针的错误释放

错误代码:

#include <iostream>

int main()
{
    int* ptr = (int*)malloc(4);

    int i = 1111;

    ptr = &i;

    std::cout << *ptr << std::endl;

    free(ptr);

    return 0;
}

在最后释放ptr指针时会出现下面错误,

原因是我们将i的指针地址赋给了ptr,也就是我们在错误的释放i的地址而不是原始的ptr地址。

正确代码:

#include <iostream>

int main()
{
    int* ptr = (int*)malloc(4);

    int i = 1111;
    int* p = &i;
    memcpy(ptr, &i, 4);

    std::cout << *ptr << std::endl;

    free(ptr);

    return 0;
}

使用memcpy函数将i的内存复制给ptr,这样ptr的地址不会改变。并且最终ptr指针可以得到很好的释放。

拓展: 使用int *p = &i; 是为了查看i地址的字节,如下所示

57 04 00 00 是1111的十六进制值,二进制是0000 0100 0101 0111(04 57), 因为字节分配在内存上是倒序的,所以我们看到的57 04 

还需要注意的是,malloc的时候要分配4个字节,因为int是4字节大小,如果只分配一个字节,那我们只能获得57(0101 0111)了、一个字节是8bit

原文地址:https://www.cnblogs.com/strive-sun/p/14000314.html