次のことを実行しようとすると、保護されたメモリに対して読み取りまたは書き込みを行おうとしているというエラーが表示されます。
void func1(int * ptr) {
int *ptr_b = new int[5];
ptr = ptr_b;
}
void main() {
int *ptr_a;
func1(ptr_a);
delete [] ptr_a;
}
これは合法ですか?
次のことを実行しようとすると、保護されたメモリに対して読み取りまたは書き込みを行おうとしているというエラーが表示されます。
void func1(int * ptr) {
int *ptr_b = new int[5];
ptr = ptr_b;
}
void main() {
int *ptr_a;
func1(ptr_a);
delete [] ptr_a;
}
これは合法ですか?
いいえ。あなたはよくある初心者の間違いを犯しています。ポインタへの参照またはポインタを要求しない限り、ポインタが値によって渡される単なる変数であることを覚えていません。関数のシグネチャを次のように変更しますvoid func1(int *& ptr)
署名を次のように変更します。
void func1(int *& ptr)
ポインタを値で渡しているので、外側ptr
は変更されません。だからそれはするようなものです
int main() { // <--- main returns int
int *ptr_a;
delete [] ptr_a;
}
ptr_a
初期化されていないため、これは不正です。
ポインタを値で渡しました。これは、関数が機能するポインターが呼び出し元のポインターのローカルコピーであることを意味します。そのため、関数で割り当てた値は、呼び出し元には表示されません。
関数がローカルコピーに割り当てるのではなく、呼び出し元のポインターに割り当てることができるように、代わりに参照によって渡します。
void func1(int* &ptr)
または、新しく割り当てられたポインタを返すことを検討してください。
int* func1()
{
return new int[5];
}
私は後者のアプローチを好みます。