我有以下代码:
struct foo {};
void bar(foo *d) {
new(d) foo(*d);
}
是否表达new(d) foo(*d)
留下指向的对象d
不变?更具体地说,如果类foo
并且其中递归包含的所有对象都只有简单的复制构造函数,那么new(d) foo(*d)
leave *d
不变?但事实并非如此的情况可能是:new
在调用复制构造函数之前首先将内存清零。 C++语言中有这样的子句吗?
Edit:有人想要这样做有一些重要的原因。考虑跨地址空间复制对象,例如从 CPU 内存到 GPU 内存。一种解决方案是逐字节处理对象。这在很多情况下都有效。如果该类具有虚拟方法,则逐字节复制会复制 vtable 指针,该指针随后将指向某个 CPU 内存。可以使用上面的表达式new(d) foo(*d)
在对象上强制编译器重置 vtable 指针。
关于放置 new 是否将内存归零,它不会,它只是调用适当的构造函数,该构造函数将执行该构造函数所做的任何操作,这可能会将内存归零,具体取决于它的定义方式。在这种特殊情况下,您使用的是复制构造函数
从您提供的代码来看,这是未定义的行为。任何一个d
指向一个有效的对象,或者不指向一个有效的对象。如果它引用一个有效的对象,则您正在对已构造的对象调用构造函数,如果该对象具有非平凡的析构函数,则这是未定义的行为。如果它之前没有被初始化(即它没有引用foo
对象),那么从它复制是未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)