栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
#include 

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;
}

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

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

#include 
#include 

struct canNotFree
{
    std::vector 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;
}


总结

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号