在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-表達式,或在必要時由實作創建。然而,複製普通可複製類型的標準中涵蓋的情況似乎僅涉及已經存在的物件。
隱式物件建立提案
提案 p0593 嘗試解決透過定義隱式物件建立操作(包括 malloc 和 memcpy)來解決這個問題。該提案尚未經過審核。
結論
目前,C 標準並未指定使用 memcpy 建立的物件何時開始其生命週期。因此,所提供的程式碼片段的行為是未定義的。提案 p0593 為這種歧義提供了潛在的解決方案,但尚未被標準接受。
以上是在 C 中使用 memcpy 建立的物件何時開始其生命週期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!