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指针时会出现下面错误,

C++ 指针的错误释放

原因是我们将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地址的字节,如下所示

C++ 指针的错误释放

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

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 指针的错误释放

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404792

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:43
下一篇 2023年4月25日 下午4:44

相关推荐