答えは「はい」ですvoid*
。参照によってaを渡すことができ、発生するエラーはそれとは無関係です。問題は、void*
参照を受け取る関数がある場合、実際にパラメーターとしてsである変数のみを渡すことができるvoid*
ということです。これには正当な理由があります。たとえば、次の関数があるとします。
void MyFunction(void*& ptr) {
ptr = malloc(137); // Get a block of raw memory
}
int* myIntArray;
MyFunction(myIntArray); // Error- this isn't legal!
上記のコードは、示された呼び出しのために、そして正当な理由で違法です。myIntArray
に渡すことができれば、配列ではないMyFunction
タイプのバッファを指すように再割り当てされます。したがって、関数から戻ると、型の配列を指していることになり、型システムが破壊されます。これは、C ++が強い型のシステムを持っていると言っているわけではありません-そうではありません-しかし、それを破壊しようとしている場合は、明示的にいくつかのキャストを入れる必要があります。void*
int
int*
void*
同様にこれを行うことはできません:
void MyFunction(void*& ptr) {
ptr = malloc(137); // Get a block of raw memory
}
int* myIntArray;
MyFunction((void*)myIntArray); // Error- this isn't legal!
これができない理由についての良い参考資料として、このコードについて考えてみてください。
void OtherFunction(int& myInt) {
myInt = 137;
}
double myDouble;
OtherFunction((int)myDouble); // Also error!
これは合法ではありません。なぜなら、double
をとった関数にを渡そうとすると、基本的に異なるバイナリ表現を持っているため、意味のないデータでのビットを壊してしまうからです。このキャストが合法であるとすれば、このような悪いことをすることは可能でしょう。int&
int
double
double
つまり、はい、あなたはを取り入れることができますvoid* &
が、もしあなたがそうするなら、あなたは本当void*
のsを渡す必要があります。Erikが上で指摘したように、解放してゼロにしたい場合は、ポインターテンプレートが最適です。
本当にこの関数にを渡したい場合はuint_8*
、次のように行うことができます。
uint_8* uPtr = /* ... */
void* ptr = uPtr;
FreeAndNull(ptr);
uPtr = (uint_8*) ptr;
これには、コンパイラに「はい、これは安全ではない可能性があることはわかっていますが、とにかく実行します」と伝えるための明示的なキャストが必要です。
お役に立てれば!