Heim > Artikel > Backend-Entwicklung > Wann beginnt die Lebensdauer eines mit memcpy in C erstellten Objekts?
Unsichere Objekterstellung mit memcpy in C
Wenn in C ein Objekt zugewiesen wird, wird sein Bytepuffer von seiner Quelle kopiert. Der genaue Mechanismus dieses Kopierens ist jedoch nicht spezifiziert, was Fragen zur Lebensdauer des Objekts aufwirft.
Bedenken Sie den folgenden Codeausschnitt:
#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); }
In diesem Code wird ein Puffer mithilfe von malloc zugewiesen. Anschließend wird mit memcpy ein trivial kopierbares Objekt a in diesen Puffer kopiert. In b wird ein Verweis auf das kopierte Objekt gespeichert.
Die Frage ist: Wann beginnt die Lebensdauer des Objekts, auf das b zeigt? Nämlich, wenn es mit memcpy kopiert wird oder wenn mit b darauf verwiesen wird?
Unklarer Standard
Der C-Standard schweigt sich derzeit zu diesem Thema aus. In einem Artikel mit dem Titel „Object Lifetime, Low-Level Programming, and memcpy“ wird vorgeschlagen, die Verwendung von memcpy für trivial kopierbare Typen als Objektkonstruktion anzuerkennen, aber dies wurde noch nicht diskutiert oder in den Standard integriert.
Draft Standard Interpretation
Der C 14-Standardentwurf schlägt vor, dass ein Objekt erstellt wird, wenn es definiert wird, erstellt mit a neuer Ausdruck oder bei Bedarf von der Implementierung erstellt. Die im Standard behandelten Fälle zum Kopieren trivial kopierbarer Typen scheinen sich jedoch nur auf bereits vorhandene Objekte zu beziehen.
Vorschlag zur impliziten Objekterstellung
Vorschlag p0593 versucht, dies zu beheben Beheben Sie dieses Problem, indem Sie implizite Objekterstellungsvorgänge definieren, einschließlich malloc und memcpy. Dieser Vorschlag wurde noch nicht überprüft.
Schlussfolgerung
Derzeit legt der C-Standard nicht fest, wann ein mit memcpy erstelltes Objekt seine Lebensdauer beginnt. Daher ist das Verhalten des bereitgestellten Codeausschnitts undefiniert. Vorschlag p0593 bietet eine mögliche Lösung für diese Unklarheit, muss jedoch noch in den Standard aufgenommen werden.
Das obige ist der detaillierte Inhalt vonWann beginnt die Lebensdauer eines mit memcpy in C erstellten Objekts?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!