Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';是否使用memcpy复制非POD对象? 根据我读过的各种来源,下面的C++代码调用未定义的行为: class A { public: virtual void method () { std::cout << "Hello" << std::endl; } }; ... A *a, *b; // obtain 2 Instances from somewhere, then... memcpy (a, b, sizeof(A)); a->method(); A类{ 公众: 虚空法(){ std::cout_C++_Undefined Behavior - Fatal编程技术网

为什么可以';是否使用memcpy复制非POD对象? 根据我读过的各种来源,下面的C++代码调用未定义的行为: class A { public: virtual void method () { std::cout << "Hello" << std::endl; } }; ... A *a, *b; // obtain 2 Instances from somewhere, then... memcpy (a, b, sizeof(A)); a->method(); A类{ 公众: 虚空法(){ std::cout

为什么可以';是否使用memcpy复制非POD对象? 根据我读过的各种来源,下面的C++代码调用未定义的行为: class A { public: virtual void method () { std::cout << "Hello" << std::endl; } }; ... A *a, *b; // obtain 2 Instances from somewhere, then... memcpy (a, b, sizeof(A)); a->method(); A类{ 公众: 虚空法(){ std::cout,c++,undefined-behavior,C++,Undefined Behavior,memcpy执行浅层复制。在一般情况下,对于不容易复制的类型,执行浅层复制是不安全的,例如,因为该类型具有需要执行特殊操作的复制构造函数 当然,您可以给出一个示例,其中使用memcpy“工作”的浅层副本实际上是可行的,但是标准必须列出所有允许的情况,这需要了解所有有效的实现选择并评估哪些是可行的 相反,标准只是说你不能这样做,这是正确的选择 使用memcpy复制原始字节。使用复制构造函数复制对象。这是一条简单的逻辑规则 为什么这会导致未定义的行为 因为该语言没有指定多态性是如何实现的,因此不能指

memcpy
执行浅层复制。在一般情况下,对于不容易复制的类型,执行浅层复制是不安全的,例如,因为该类型具有需要执行特殊操作的复制构造函数

当然,您可以给出一个示例,其中使用
memcpy
“工作”的浅层副本实际上是可行的,但是标准必须列出所有允许的情况,这需要了解所有有效的实现选择并评估哪些是可行的

相反,标准只是说你不能这样做,这是正确的选择

使用
memcpy
复制原始字节。使用复制构造函数复制对象。这是一条简单的逻辑规则

为什么这会导致未定义的行为

因为该语言没有指定多态性是如何实现的,因此不能指定多态类型是可复制的

我看不到该语言的任何逻辑实现,因为它的行为与预期不符

多态性可以实现为从对象地址到类型信息的映射,而不是存储在每个对象中的指针。人们可能会争论这是好是坏,但这肯定不是不合逻辑的

为什么语言设计者选择不定义它


因此,不要限制提出更好的多态性实现的可能性。你看不到替代方案并不一定意味着它们不存在。

如果你使用memcpy,那么你就绕过了对象的副本构造函数。这会使你的程序处于不连贯的状态(又称未定义的行为).

AFAICT多态性的可能实现只有两类:对象的类型是对象数据的固有类型,如vtable,或者使用某种外部方法关联类型,并且对象的数据仅被解释为声明的数据元素。但在任何一种情况下,这种情况都会发生(其中源和目标具有相同的类型)将保证工作:如果是内部的,对象类型将被复制,因此保持不变,而如果是外部的,则机制将保持不变,类型信息将保持不变。@jules:可能是这样,也可能不是这样,但标准没有试图列举所有可能的实现,甚至只是你能想象的那些实现。它将实现交给了实现者,而不限制它们保持类的平凡性。多态类在其他方面也通常是非平凡的,而且您很少希望将字节争用与高级抽象结合起来,因此对我来说这似乎是完全合理的。在一般情况下这样做可能不安全,但是conseq如果您了解所讨论的类的实现,那么这样做的好处应该是完全可以知道的。我仍然看不出为什么在这里有未定义的行为对语言设计者或实现者有用。它对实现者没有用处,它是为了阻止白痴开枪打自己的脚。使用
memcpy
复制class破坏了封装。如果类作者定义了一个复制构造函数或其他非平凡的特殊成员函数,那么他们可能有很好的理由这样做,并且通过其他方式复制它可能会破坏类的不变量。如果类是虚拟的,则编译器在幕后初始化类时会做一些事情SERS不应该通过绕过初始化并创建未构造的Frand Enthin对象来创建对象。或者换句话说,语言“您想要做什么打破了C++的对象模型,这是不支持的”。@JonathanWakely:在类/结构不执行动态内存分配且不使用任何资源的非POD类型上使用memcpy可以吗?这个程序可以吗?具有定义良好的行为?@PravasiMeet,不,不可以。我的答案和上面的注释的哪一部分不清楚?是的,但应该是可预测的状态(例如,如果复制包含资源的对象,则该资源将被双重释放,除非您采取某些措施加以阻止)。