跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • C++ 之 new 函数疑问,你们也有这种情况吗?
未分類
11 5 月 2020

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

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

資深大佬 : sl0000 17

读取 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)

  • 資深大佬 : felix021

    估计 C++规范对 placement new 没有做内存清零的要求,具体做不做就看编译器的实现了。

    ref: https://stackoverflow.com/questions/10490191/does-placement-new-zero-out-the-memory

  • 資深大佬 : felix021

    注:不做某件事情,当然是为了更快

  • 資深大佬 : dearmymy

    感觉跟编译器有关吧,而且你 debug release 估计也不一样,也许 debug 帮你清了。release 就不管你。
    不知道你想干啥,你要是嫌弃 new 出来的内存对齐空余部分,可以把内存对齐设置下

  • 主 資深大佬 : sl0000

    @dearmymy 主要是因为阅读的时候会被干扰到,一些没有用的数据穿插其中

  • 資深大佬 : dearmymy

    @sl0000 那构造函数自己清零下,在加上#pragma pack(1) 就不会出现字节对齐间隙了

  • 資深大佬 : hu8245

    operator new

  • 資深大佬 : Wirbelwind

    operator new 和 delete 本身不会清除内存数据,因为操作系统底层可能会清除。

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

    (某个协程库是分配栈也会清 0,但是重复使用某个栈的时候不会清 0.)

  • 資深大佬 : felix021

    @dearmymy pragma pack(1) 还是要慎用,可能会导致性能问题

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具