cat
はではありません。はこの関数の呼び出し元に返されます。 cat = longcat
を実行すると、ローカルコピーのみが変更されます。
これは、この関数に渡したパラメータが、あなたが非常に不便に削除した古いアドレスを指していることを示しています。
参照として渡すか、古いCダブルポインタをトリックしてそのアドレスを渡します。
はまた、あなた破損しているメモリといけないあなたはこれを呼び出して初めて、cat
が有効な値を持っていることとsize
とlooong
は(looong * 2 >= size
)互換性があることを確認することをお勧めします。
はあなたの問題を示し、次のコードを見てください:
#include <iostream>
void longcatislong1(int* cat, int &size, int &looong)
{
int* longcat = new int[looong*2];
for(int i = 0; i < size; i = i + 1)
longcat[i] = cat[i];
delete [] cat;
cat = longcat;
looong = looong * 2;
}
void longcatislong2(int*& cat, int &size, int &looong)
{
int* longcat = new int[looong*2];
for(int i = 0; i < size; i = i + 1)
longcat[i] = cat[i];
delete [] cat;
cat = longcat;
looong = looong * 2;
}
int main (void) {
int sz = 0;
int lng = 10;
int *ct = 0;
std::cout << ct << std::endl;
longcatislong1 (ct, sz, lng);
std::cout << ct << std::endl;
longcatislong2 (ct, sz, lng);
std::cout << ct << std::endl;
return 0;
}
その出力は次のようになります。longcatislong1
呼び出しが正常復帰にct
を設定しなかったことを意味
0
0
0x9c83060
。参照としてポインタを渡すlongcatislong2
関数は、を実行し、を正しく設定します。ct
です。
0xf0000000
への有効なポインタがあるとします。元の関数を呼び出すと、新しいメモリブロックが割り当てられ、データがコピーされ、古いブロックが削除されます。
しかし、変数ct
は、まだ古いブロックを指しています。
次の他の場所でct
を参照解除する場合でも、一般に未定義の動作と呼ばれる苦痛の世界に入ります。最初のパラメータに参照型にすることにより
、関数の中で行われた変更は、バックに渡された変数に反映されている。
-1 4chanの上4chanの保管してください。 (とにかくしようとするなら、少なくとも新しいものにはならない--- ...) – GManNickG
ルール1とルール2は分かりませんか? –
これは基本的にC++を使用するための規則です。すべての行はスチームローラーです。 – ActiveTrayPrntrTagDataStrDrvr