¿Se pueden copiar objetos C++ utilizando una copia bit a bit? Me refiero al uso de memcopy_s? ¿Hay un escenario en el que eso puede salir mal?¿Puedo hacer una copia bit a bit de un objeto C++?
Respuesta
Si son tipos de datos antiguos simples (POD), esto debería funcionar. Cualquier clase que tenga instancias de otras clases dentro de ella fallará potencialmente, ya que las está copiando sin invocar a sus constructores de copia. La forma más probable de que falle es que uno de sus destructores liberará algo de memoria, pero usted ha duplicado punteros que lo señalan, por lo que luego intenta usarlo desde uno de sus objetos copiados y obtener una segfault. En resumen, no lo hagas a menos que sea un POD y estés seguro de que siempre será un POD.
No, hacerlo puede causar muchos problemas. Siempre debe copiar los tipos de C++ utilizando el operador de asignación o el constructor de copia.
El uso de una copia bit a bit interrumpe cualquier tipo de gestión de recursos porque al final del día se quedan 2 objetos para los cuales se ejecutó 1 constructor y se ejecutarán 2 destructores.
Considere como ejemplo un puntero ref contado.
void foo() {
RefPointer<int> p1(new int());
RefPointer<int> p2;
memcpy(&p2,p1,sizeof(RefPointer<int>));
}
Ahora ambos p1 y p2 están reteniendo los mismos datos sin embargo, el mecanismo de conteo ref interna no ha sido notificado. Ambos destructores se ejecutarán pensando que son el único propietario de los datos que potencialmente pueden causar la destrucción del valor dos veces.
Vale la pena señalar que incluso con las clases POD'ish (es decir, campos POD solamente, pero, por ejemplo, también el método virtual), sigue siendo técnicamente U.B., incluso cuando funciona. –
Depende de la implementación del objeto C++ que está intentando copiar. En general, el propietario de la memoria del objeto C++ es el objeto en sí, por lo que tratar de "moverlo" o "copiarlo" con algo como memcopy_s va detrás de su espalda, lo que a menudo le ocasionará problemas.
Normalmente, si se pretende copiar o mover un objeto C++, existen API dentro de la misma clase que lo facilitan.
En general, si su estructura contiene punteros, no puede memcpy porque la estructura probablemente asigna espacios de memoria nuevos y los señala. Una memcpy no puede manejar eso.
Sin embargo, si su clase solo tiene tipos primitivos, no punteros, usted debería.
Además del problema de llamadas de administración de recursos desequilibradas en las dos instancias que termina después de una memcopy (como @JaredPar y @rmeador señaladas), si el objeto admite una noción de ID de instancia haciendo una memcopy se irá con dos instancias con la misma ID. Esto puede conducir a todo tipo de problemas "interesantes" para cazar más adelante, especialmente si sus objetos están mapeados en una base de datos.
Si es un objeto único, ¿por qué no usar el operador de asignación (supongo que el operador de asignación generado por el compilador podría implementarse en términos de memcpy
si eso es tan ventajoso, y el compilador sabe mejor si su clase es un POD.)
Si desea copiar una matriz de objetos, puede usar std :: copy. Dependiendo de la implementación, esto puede terminar utilizando memmove
(una cosa más que puede ensuciar, los almacenamientos intermedios pueden solaparse, no sé si el memcpy_s
no estándar de alguna manera comprueba si los tipos implicados lo permiten). Nuevamente, la decisión es tomada por el compilador, que lo hará bien incluso si los tipos son modificados.
- 1. C bit opera/copia un bit de un byte a otro byte
- 2. Indicadores de bit a bit en Delphi
- 3. Cuál es la forma más eficiente de hacer operaciones bit a bit en una matriz C
- 4. Python: aritmética bit a bit sin signo de 32 bit
- 5. PHP matriz bit a bit
- 6. AND bit a bit/NO de VB.NET a C#
- 7. Reemplazar bit menos significativo con operaciones bit a bit
- 8. bit a bit de sustracción en Python
- 9. Arrays de desplazamiento bit a bit
- 10. ¿Puedo usar OR bit a bit para enumeraciones de Java
- 11. AND bit a bit, bit a bit pregunta Incluido O, en Java
- 12. OR bit a bit de las constantes
- 13. Tipo de devolución de operadores bit a bit en C++
- 14. ¿Cómo se utilizan las marcas bit a bit en C++?
- 15. Lua - Operaciones lógicas de bit a bit
- 16. operaciones bit a bit en Postgres
- 17. Operador bit a bit en firebird
- 18. aplicaciones prácticas de operaciones bit a bit
- 19. Implementación de ArrayDeque.allocateElements (operaciones bit a bit)
- 20. salida extraña por bit a bit NO
- 21. la realización de una suma bit a bit
- 22. C# convertir bit a booleano
- 23. Explicación de bit a bit NO operador
- 24. operaciones bit a bit MySQL y filtrar
- 25. Operaciones bit a bit en el corto
- 26. El uso de un bit a bit y el interior de una sentencia if
- 27. bit a bit-o agregado en una subconsulta
- 28. Operador bit a bit en SQLAlchemy
- 29. ¿Qué son los operadores bit a bit?
- 30. operadores bit a bit en Postgres
Incluso POD es peligroso si un elemento es 'SomeType * x' y el espacio está asignado: ahora tiene dos copias de un puntero, y es probable que algo se borre por partida doble, lo cual no es bueno. –
Arriesgado, sí, pero no es en sí mismo un error. Como el tipo es POD, no tiene un destructor furtivo que intentará eliminar el puntero, por lo que solo se borrará por partida doble si lo haces tú mismo. – jalf