I have the following code :
struct foo {};
void bar(foo *d) {
new(d) foo(*d);
}
表达式
new(d) foo(*d)
是否不改变由d
指向的对象?更具体地说,如果类foo
及其递归包含的所有对象仅具有平凡的复制构造函数,则new(d) foo(*d)
是否会保持*d
不变?一个不成立的情况可能是new
在调用复制构造函数之前将内存清零。C++语言中是否存在这样的条款?
编辑:有非平凡的原因可以让人们这样做。考虑将对象从地址空间复制到另一个地址空间,例如从CPU内存到GPU内存。其中一种解决方案是对对象进行逐字节拷贝。这在很多情况下都有效。如果类具有虚方法,则逐字节拷贝会复制vtable指针,该指针将指向某些CPU内存。可以使用上述表达式new(d) foo(*d)
强制编译器重置vtable指针。
new
会将内存清零吗?在构造函数中没有明确初始化的POD成员具有垃圾值。 - jamesdlin