Maison > Article > développement back-end > Quand un objet créé avec memcpy en C commence-t-il sa durée de vie ?
Création d'objet incertaine avec memcpy en C
En C , lorsqu'un objet est alloué, son tampon d'octets est copié depuis sa source. Cependant, le mécanisme exact de cette copie n'est pas précisé, ce qui soulève des questions sur la durée de vie de l'objet.
Considérez l'extrait de code suivant :
#include <cstdlib> #include <cstring> struct T // trivially copyable type { int x, y; }; int main() { void *buf = std::malloc( sizeof(T) ); if ( !buf ) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
Dans ce code, un tampon est alloué à l'aide de malloc. Un objet copiable trivial a est ensuite copié dans ce tampon à l'aide de memcpy. Une référence à l'objet copié est stockée dans b.
La question est : quand commence la durée de vie de l'objet pointé par b ? À savoir, lorsqu'il est copié à l'aide de memcpy ou lorsqu'il est pointé par b ?
Standard peu clair
Le standard C est actuellement silencieux sur ce problème. Un article intitulé "Object Lifetime, Low-level Programming, and memcpy" propose que les utilisations de memcpy pour les types trivialement copiables soient reconnues comme construction d'objets, mais cela n'a pas encore été discuté ou incorporé dans la norme.
Projet d'interprétation de la norme
Le projet de norme C 14 suggère qu'un objet est créé lorsqu'il est défini, créé à l'aide d'une nouvelle expression ou créé par la mise en œuvre lorsque cela est nécessaire. Cependant, les cas couverts par la norme pour la copie de types trivialement copiables semblent se référer uniquement à des objets déjà existants.
Proposition de création implicite d'objets
La proposition p0593 tente de résoudre résoudre ce problème en définissant des opérations de création d'objets implicites, notamment malloc et memcpy. Cette proposition n'a pas encore été examinée.
Conclusion
Actuellement, la norme C ne précise pas quand un objet créé à l'aide de memcpy commence sa durée de vie. Par conséquent, le comportement de l’extrait de code fourni n’est pas défini. La proposition p0593 offre une solution potentielle à cette ambiguïté, mais elle n'a pas encore été acceptée dans la norme.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!