Maison > développement back-end > C++ > le corps du texte

Quand un objet créé avec memcpy en C commence-t-il sa durée de vie ?

DDD
Libérer: 2024-11-08 18:55:02
original
171 Les gens l'ont consulté

When Does an Object Created with memcpy in C   Begin Its Lifetime?

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, &amp;a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal