读取 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 ();
经提醒,我改为默认构造函数确实是都被清零了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.