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

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

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

    读取 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   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
        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) 还是要慎用,可能会导致性能问题
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1749 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:46 · PVG 00:46 · LAX 09:46 · JFK 12:46
    ♥ Do have faith in what you're doing.