C での memcpy による不確実なオブジェクト作成
C では、オブジェクトが割り当てられると、そのバイトのバッファーがそのソースからコピーされます。ただし、このコピーの正確なメカニズムは未指定であり、オブジェクトの有効期間について疑問が生じます。
次のコード スニペットを考えてみましょう。
#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); }
このコードでは、malloc を使用してバッファが割り当てられます。次に、memcpy を使用して、簡単なコピー可能なオブジェクト a がこのバッファにコピーされます。コピーされたオブジェクトへの参照は b に保存されます。
問題は、b が指すオブジェクトの存続期間はいつ始まるのかということです。つまり、memcpy を使用してコピーされたとき、または b によってポイントされたとき?
不明瞭な標準
C 標準は現在、この問題について沈黙しています。 「オブジェクトのライフタイム、低レベルプログラミング、および memcpy」というタイトルの論文では、簡単にコピー可能な型に対する memcpy の使用がオブジェクト構築として認識されることを提案していますが、まだ議論されておらず、標準にも組み込まれていません。
ドラフト標準の解釈
C 14 ドラフト標準では、オブジェクトは定義時に作成されるか、new-expression を使用して作成されるか、必要に応じて実装によって作成されることが示唆されています。ただし、自明にコピー可能な型をコピーするための標準でカバーされているケースは、既存のオブジェクトのみを参照しているようです。
暗黙的なオブジェクト作成の提案
提案 p0593 は対処しようとしています。この問題は、malloc や memcpy などの暗黙的なオブジェクト作成操作を定義することで解決されます。この提案はまだレビューされていません。
結論
現在、C 標準では、memcpy を使用して作成されたオブジェクトがいつその有効期間を開始するかを指定していません。したがって、提供されたコード スニペットの動作は未定義です。提案 p0593 は、この曖昧さに対する潜在的な解決策を提供しますが、まだ標準として受け入れられていません。
以上がC の memcpy で作成されたオブジェクトはいつから有効期間を開始しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。