我從SO上發佈的幾個問題閱讀了關於這一段的內容。爲什麼不保證memcpy對非POD類型安全?
我不能完全弄清楚爲什麼memcpy
不能保證對非POD類型安全。我的理解是,memcpy
只是一個按位拷貝。
下面是從標準
POD
類型T
的報價對於任何對象(比基類子對象等),對象是否保持T
類型的有效值, 底層字節(1.7)構成的對象可以被拷貝到char
或unsigned char
0.41)如果char
或unsigned char
陣列的內容 被複制回對象的陣列,該對象隨後應保持其原始 值。# define N sizeof (T) char buf[N]; T obj ; // obj initialized to its original value std :: memcpy (buf , & obj , N); // between these two calls to std::memcpy, // obj might be modified std :: memcpy (& obj , buf , N); // at this point, each subobject of obj of // scalar type holds its original value
如果定義了複製構造函數,而不是按位複製,會發生什麼? –
'memcpy'是一個按位拷貝。非POD類型不一定表現出按位複製語義。 – lapk
但這不是標準所說的......標準說......「對象將隨後保持其原始值」,這在記憶非POD類型時是正確的。 – ROTOGG