私のコードでは、データ メンバーとして格納し、必要に応じて元のポインターにvoid*
型キャストする必要があるとします。class
その信頼性をテストするために、テスト プログラム(linux ubuntu 4.4.1 g++ -04 -Wall)を作成しましたが、その動作を見てショックを受けました。
struct A
{
int i;
static int c;
A () : i(c++) { cout<<"A() : i("<<i<<")\n"; }
};
int A::c;
int main ()
{
void *p = new A[3]; // good behavior for A* p = new A[3];
cout<<"p->i = "<<((A*)p)->i<<endl;
((A*&)p)++;
cout<<"p->i = "<<((A*)p)->i<<endl;
((A*&)p)++;
cout<<"p->i = "<<((A*)p)->i<<endl;
}
これは単なるテスト プログラムです。私の場合、実際には、ポインターを として保存void*
してから、実際のポインターにキャストすることが必須です (の助けを借りてtemplate
)。ですから、その部分は気にしないでください。上記のコードの出力は、
p->i = 0
p->i = 0 // ?? why not 1
p->i = 1
ただし、をに変更するvoid* p;
と、期待される動作A* p;
が得られます。なぜ ?
別の質問です。(A*&)
それ以外の場合は使用できませんoperator ++
。しかし、それは警告も出します。型がパニングされたポインターを逆参照すると、strict-aliasing rules が壊れます。warning を克服する適切な方法はありますか?