读取 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 ();
经提醒,我改为默认构造函数确实是都被清零了。
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 |
2
felix021 2020-04-27 15:35:06 +08:00 2
注:不做某件事情,当然是为了更快
|
3
dearmymy 2020-04-27 15:49:49 +08:00
感觉跟编译器有关吧,而且你 debug release 估计也不一样,也许 debug 帮你清了。release 就不管你。
不知道你想干啥,你要是嫌弃 new 出来的内存对齐空余部分,可以把内存对齐设置下 |
6
hu8245 2020-04-27 16:23:00 +08:00
operator new
|
7
Wirbelwind 2020-04-28 22:16:27 +08:00
operator new 和 delete 本身不会清除内存数据,因为操作系统底层可能会清除。
我记得 linux 分配新栈时候是会清 0 的。 (某个协程库是分配栈也会清 0,但是重复使用某个栈的时候不会清 0.) |