C++ 疑惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hua123s
V2EX    C++

C++ 疑惑

  •  
  •   hua123s
    powerfulyang 2020-02-09 13:57:50 +08:00 3643 次点击
    这是一个创建于 2105 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经常看到如下代码。非 C++程员但需要使用该语言。

    char *cstr = new char[arg0.length() + 1]; delete [] cstr; 

    是否当接收返回值是指针的都需要 delete ?并且方法内局部变量也需要 delete ?

    如果不操作可能导致的问题是什么么?

      • 纯新手发问。谢谢大佬们 教教!!!
    18 条回复    2020-02-23 18:58:58 +08:00
    classyk
        1
    classyk  
       2020-02-09 14:03:30 +08:00 via iPhone   2
    1. 不是,要看情况而定。
    2. 不释放的话,越跑可用内存越少,最后分配不到内存,就挂了

    c/cpp 是需要手工维护内存使用的。智能指针能起一部分作用
    optional
        2
    optional  
       2020-02-09 14:07:36 +08:00   1
    智能指针走起来
    jmc891205
        3
    jmc891205  
       2020-02-09 14:08:16 +08:00   1
    你手动去堆上申请的内存 你要负责释放
    不然就导致内存泄漏
    stephenyin
        4
    stephenyin  
       2020-02-09 14:23:41 +08:00   2
    1.简单的说, 用 new 得到的指针都需要 delete.
    2.不释放的话,该进程使用的内存就越来越多,如果对应的指针变量丢失就是内存泄露了.
    hua123s
        5
    hua123s  
    OP
       2020-02-09 14:30:08 +08:00
    @optional 新手 不太懂 233
    hua123s
        6
    hua123s  
    OP
       2020-02-09 14:31:23 +08:00
    @stephenyin

    int a = 1;
    int* b = &a;
    这个时候 b 就不用 delete ?(●''●)
    ipwx
        7
    ipwx  
       2020-02-09 14:34:45 +08:00 via Android   1
    @hua123s 指针不关键。new 出来的要 delete, malloc 出来要 free。就这么简单
    hua123s
        8
    hua123s  
    OP
       2020-02-09 14:36:42 +08:00
    @ipwx 好的 么么哒
    stephenyin
        9
    stephenyin  
       2020-02-09 14:43:31 +08:00
    @hua123s #6 不需要
    shilyx
        10
    shilyx  
       2020-02-09 16:36:06 +08:00   1
    1、new 出来的就要 delete

    2、每个需要 delete 的只能 delete 一次

    ps:c++危急,后继无人。有问题到我群里来问 1046884003,义务解答(不代做作业)
    wzzzx
        11
    wzzzx  
       2020-02-09 16:57:59 +08:00 via Android   1
    用了 new 就一定要用 delete,记得就好
    neroransom
        12
    neroransom  
       2020-02-09 22:03:51 +08:00   1
    局部变量生命周期结束就自动消亡了。
    指针就是一个四字节的变量。
    delete 与否和指针没关系,delete 是用 new 进行动态内存分配后,释放 new 出来的内存用的,因为他不像局部变量一样会自动消亡。

    以你的代码为例,如果不 delete []cstr,则 cstr 这个指针函数运行完了就没了,但是他指向的那片空间还在,而且没有能找到他的指针了,这种程序多跑几次内存就爆了。
    levelworm
        13
    levelworm  
       2020-02-22 03:57:56 +08:00
    凡是 new 的都是创建在 heap 上的,所以不释放就一直在那里。new 和 delete 必须成对,哪一个多了都有问题。
    FrankHB
        14
    FrankHB  
       2020-02-22 10:13:08 +08:00
    八成得把写这代码的拉过来扁一顿。
    合格的 C++ 程序员最起码不应该“经常”整出来这种代码让你看到。

    @neroransom LP64/ILP64/LLP64: ?
    @levelworm free store: ??
    [[fallthrough]];
    @stephenyin @ipwx @shilyx placement new: ???
    levelworm
        15
    levelworm  
       2020-02-22 11:34:50 +08:00 via Android
    @FrankHB 写习惯了,delete...
    hua123s
        16
    hua123s  
    OP
       2020-02-22 13:17:12 +08:00 via iPhone
    @FrankHB ...你说的完全看不懂。
    FrankHB
        17
    FrankHB  
       2020-02-22 13:42:27 +08:00   2
    @hua123s 首先清楚大多数 C++ 用户不应该直接使用 new 和 delete 就够了。
    具体原因么……替代的东西多了去了,没必要用;正常都是直接创建对象或者带所有权的智能指针( std::unique_ptr 和 std::shared_ptr )+不带所有权的引用 /视图( std::reference_wrapper/observer_ptr/string_view/span/...)。
    两者的区别是,前者是非常底层的东西,必须自觉才能保证 no resource leak,并且还得小心才能保证 basic exception safety ;后者只要实现对(不滥用前者)默认就不会有这个问题。这种基本的 invariant guarantee 是在任何程序设计中都应当是普遍的重要的默认应该保持的东西,只不过不少语言根本不提供像 new 和 delete 这种依赖自觉不手贱才能维护 invariant 的危险操作,才让你看不出来这种保证的重要性。
    要是几十年前古董代码用户水平又不够只会 new/delete 还能理解,现在正常情况一般代码根本不应该直接用这种底层而危险的东西。就算 new/delete 用对了不会导致功能问题,出现 new 而不能保证排除漏 delete 这种会导致最终用户直接受到影响(资源泄漏)的 invariant breakage,放任这种代码导致每个出现 new 的地方都要人肉找一遍 delete (因为这方面工具不保证完全靠谱)才能最终确保正确,这直接就是可维护性灾难。所以正常的 code review 就不应该放过这种低级问题,应用代码看到 new 和 delete 就直接回炉重造基本不会有错。
    需要打死的还有一个理由是因为历史原因这方面实践普遍比较差,所以替代虽然理由应该明确,风格上也很混乱。很多大的项目可能自己有一套 API 做专门的封装。相比之下 Rust 就没 C++ 那么糟烂(但是也并不容易上手)。

    另外不是给你看的,不过也算是基础内容(虽然大多数 C++ 用户这方面基础完全不合格,麻烦知耻):
    1. new 不一定从 heap 上分配。new 底层实现的 operator new 作为 allocation function 且没被用户自定义时,分配的是 free store,而 heap 是 free store 在 hosted implementations 的一种普遍实现。这不是必要的。
    2. 标准库提供默认的 placement new 就不分配。与此相对应该注意不遗漏是析构函数调用语法(……以及 std::launder 什么乱七八糟的),而不是 delete ; placement delete 仅在异常时被调用。
    neroransom
        18
    neroransom  
       2020-02-23 18:58:58 +08:00 via Android
    @FrankHB 好吧,说得不够严谨
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2508 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:58 PVG 12:58 LAX 20:58 JFK 23:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86