C++ 之 new 函数疑问,你们也有这种情况吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sl0000
V2EX    C++

C++ 之 new 函数疑问,你们也有这种情况吗?

  •  
  •   sl0000 2020-04-27 15:23:50 +08:00 2515 次点击
    这是一个创建于 2067 天前的主题,其中的信息可能已经有所发展或是发生改变。

    读取 new 出来的对象占用的连续堆内存,偶然发现时有时无的存在一些脏数据,但是通过栈内存分配的对象不会存在脏数据。脏数据的出现与内存对齐优化有关。

    new 函数并不会把 sizeof(Cls)的连续内存全部清空,只会清除使用到的内存,内存对齐的空置的内存并不会被清零。

    class Cls { Public; long a; char b; long c; char d; }; char s[256] = {}; for int i = 0; i < 256; i++) { s[i] = 0xff; } Cls * pa = new (s) Cls {1,2,3,4}; 

    (lldb) memory read --size 4 -format x --count 64 pa

    用的 Xcode,这种情况是所有平台都会出现吗?如果是,那么这种设计是为什么?

    Cls * pa = new (s) Cls (); 

    经提醒,我改为默认构造函数确实是都被清零了。

    8 条回复    2020-04-29 00:18:47 +08:00
    felix021
        1
    felix021  
       2020-04-27 15:34:16 +08:00
    估计 C++规范对 placement new 没有做内存清零的要求,具体做不做就看编译器的实现了。

    ref: https://stackoverflow.com/questions/10490191/does-placement-new-zero-out-the-memory
    felix021
        2
    felix021  
       2020-04-27 15:35:06 +08:00   2
    注:不做某件事情,当然是为了更快
    dearmymy
        3
    dearmymy  
       2020-04-27 15:49:49 +08:00
    感觉跟编译器有关吧,而且你 debug release 估计也不一样,也许 debug 帮你清了。release 就不管你。
    不知道你想干啥,你要是嫌弃 new 出来的内存对齐空余部分,可以把内存对齐设置下
    sl0000
        4
    sl0000  
    OP
       2020-04-27 15:51:16 +08:00
    @dearmymy 主要是因为阅读的时候会被干扰到,一些没有用的数据穿插其中
    dearmymy
        5
    dearmymy  
       2020-04-27 15:58:41 +08:00   1
    @sl0000 那构造函数自己清零下,在加上#pragma pack(1) 就不会出现字节对齐间隙了
    hu8245 data-uid=
        6
    hu8245  
       2020-04-27 16:23:00 +08:00
    operator new
    Wirbelwind
        7
    Wirbelwind  
       2020-04-28 22:16:27 +08:00
    operator new 和 delete 本身不会清除内存数据,因为操作系统底层可能会清除。

    我记得 linux 分配新栈时候是会清 0 的。

    (某个协程库是分配栈也会清 0,但是重复使用某个栈的时候不会清 0.)
    felix021
        8
    felix021  
       2020-04-29 00:18:47 +08:00
    @dearmymy pragma pack(1) 还是要慎用,可能会导致性能问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1183 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 17:40 PVG 01:40 LAX 09:40 JFK 12:40
    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