7

これはまったくの仮説ですが、次のコードが C++ 仕様に従って未定義の動作になるかどうかはわかりません。オブジェクト内のバイトのコピーを作成し、オブジェクトをゼロで上書きして爆破し、古いバイトをコピーして戻したいと思います。未定義の動作を引き起こさずにそうすることができますか?

サンプルコード:

NonPODType o;
char bytes[sizeof(o)];

memcpy(bytes, &o, sizeof(o));
memset(&o, 0, sizeof(o));
memcpy(&o, bytes, sizeof(o));
4

2 に答える 2

9

一般的に、いいえ。これが§3.9/2 の自明にコピー可能な型に対して機能するという明示的な保証がありますが、他の型にはそのようなことはありません。

単純にコピー可能な type のオブジェクト (基本クラスのサブオブジェクト以外) のT場合、オブジェクトが type の有効な値を保持しているかどうかにかかわらず、オブジェクトを T構成する基になるバイト (1.7) をcharまたはの配列にコピーできますunsigned charcharまたはの配列の内容が 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

—終わりの例]

于 2012-06-08T17:29:35.900 に答える
1

一般的に、はい。オブジェクトが壊れる唯一の方法は、オブジェクトを破棄した後、そのデータを復元する前にオブジェクトにアクセスする場合です。

memset(&o, 0, sizeof(o));

obj.doSomething(); <--- 休憩

memcpy(&o, バイト, sizeof(o));

于 2012-06-08T19:05:22.847 に答える