学部のカリキュラムの多くでJavaに夢中になっていたので、C ++に関しては、私は比較的初心者です(残念です)。メモリ管理は面倒ですが、私はansiCとC++に関する本をたくさん購入しました。関連する質問を調べましたが、この特定の基準に一致する質問が見つかりませんでした。多分それは誰もそれについて言及していないのは明らかですか?
この質問は私を悩ませてきましたが、私が利用していない概念的なポイントがあるように感じます。
仮定する:
char original[56];
cstr[0] = 'a';
cstr[1] = 'b';
cstr[2] = 'c';
cstr[3] = 'd';
cstr[4] = 'e';
cstr[5] = '\0';
char *shaved = shavecstr(cstr);
// various operations, calls //
delete[] shaved;
どこ、
char* shavecstr(char* cstr)
{
size_t len = strlen(cstr);
char* ncstr = new char[len];
strcpy(ncstr,cstr);
return ncstr;
}
その点で重要なのは、「original」を文字で埋めるバッファにし、そのコピーを定期的に削って他の場所で使用することです。
明確にするために、オリジナルは、、、、または任意のインプレース充填入力リーダーを介して充填されますstd::gets(char* buff)
。文字列を「削る」ために、基本的に切り捨てられ、未使用の配列スペースが削除されます。std::getline(char* buff, buff_sz)
std::read(char* buff, buff_sz)
このエラーはヒープ割り当てエラーであり、に発生しますdelete[]
。
リークを防ぐために、「shaved」によって保持されているメモリを解放して、いくつかの引数を通過した後に再び使用できるようにします。これが制限されているのにはおそらく正当な理由がありますが、この構成ではデータの元の所有者(ポインタ)にアクセスする方法がないため、メモリを解放する方法があるはずです。