码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2022-06-25 C++老八股之 new 的内存用 free 回收有危险


    C++老八股之 new 的内存用 free 回收有危险

    • 关于 new delete malloc free
    • 举个例子
    • 总结


    关于 new delete malloc free

    C++为什么要用 new 和 delete 。

    大概是为了解决某些含有资源,需要确保通过析构,释放资源的类的对象留存。你可以认为是为了保障 RAII 的一种设置。

    C则不必为此操心,虽然为此会更操心,但是操心也没卵用,没有class封装,只能整天提心内存泄漏,更没有 RAII 如此优雅的机制。


    举个例子

    对于内置类型,是 OK 的,对只含有内置类型的类对象,也是 OK 的。

    因为其内存和类实体是合一的,实体即内存。

    以下代码是不安全的,只供学习!

    #include <iostream>
    #include <vector>
    
    struct canFree
    {
        int intArry[3] = {0, 1, 2};
    };
    
    int main()
    {
        canFree *testCanFree = new canFree();
    
        int *rawDataCf = testCanFree->intArry;
    
        std::cout << "testCanFree before free " << std::endl;
    
        for (int i = 0; i != 3; ++i)
        {
            std::cout << *(rawDataCf + i) << std::endl;
        }
    
        free(testCanFree);
    
        std::cout << "testCanFree after free " << std::endl;
    
        for (int i = 0; i != 3; ++i)
        {
            std::cout << *(rawDataCf + i) << std::endl;
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    对于非内置类型,包括标准容器,则必然是 LeakMem。

    因为类实体和内存是分离的,实体只包含一个符号,符号指向内存,把符号抹除,内存还在。

    #include <iostream>
    #include <vector>
    
    struct canNotFree
    {
        std::vector<std::string> strVec = {"free", "and", "memleak"};
    };
    
    int main()
    {
        canNotFree *testCanNotFree = new canNotFree();
    
        std::string *rawDataCnf = testCanNotFree->strVec.data();
    
        std::cout << "testCanNotFree before free " << std::endl;
    
        for (int i = 0; i != 3; ++i)
        {
            std::cout << *(rawDataCnf + i) << std::endl;
        }
    
        free(testCanNotFree);
    
        std::cout << "testCanNotFree after free " << std::endl;
    
        for (int i = 0; i != 3; ++i)
        {
            std::cout << *(rawDataCnf + i) << std::endl;
        }
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    总结

    相信如果运行过上面的代码,就比较容易理解了。

    深入理解,可能还是需要自己实现一个符号和资源分离的类,比如 vector 容器,还要理解符号和实体之间的关系。

    我写下月亮两个字,你能知道这是天上的阴晴圆缺,我把月亮两个字从笔记上擦掉,你晚上抬头,依旧悲欢离合,没有任何区别。

  • 相关阅读:
    超级超级灵性的解题思路,看了全部的题解,没有人想到这个思路,真·力扣唯一——用单调栈处理LeetCode 1562 查找大小为M的最新分组
    文件回车换行引起的Visual Studio 2022编译失败问题的分析
    postman使用方法
    YOLOv5 结合切片辅助超推理算法 | 这才叫让小目标无处遁形!
    Gerrit:ssh key 配置/报错:Permission denied (publickey)
    OSPF协议LSDB同步过程和邻居状态机
    PHP去除BOM头的方法
    响应头缺失、Options方法
    【漏洞复现】SolarWinds——任意文件读取
    C语言-文件操作(最全)(二十一)
  • 原文地址:https://blog.csdn.net/m0_54206076/article/details/125463265
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号