0

学部のカリキュラムの多くで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」によって保持されているメモリを解放して、いくつかの引数を通過した後に再び使用できるようにします。これが制限されているのにはおそらく正当な理由がありますが、この構成ではデータの元の所有者(ポインタ)にアクセスする方法がないため、メモリを解放する方法があるはずです。

4

2 に答える 2

1

に置き換えると仮定しますoriginal。そうしないと、宣言されていcstrないコードがコンパイルされません。cstr

ここでのエラーは、割り当てられた配列のサイズが小さすぎることです。char* ncstr = new char[len+1];終了を説明する必要があります\0

shavedまた、関数が戻った直後に削除すると、関数を呼び出しても意味がありません...

[*]もう少し深くするためcstrに、含まれている関数が戻ったときに、に使用されていたメモリが解放されます。通常、このような静的文字列は、アプリケーションの全期間にわたって存続する定数に配置されます。たとえば、const char* cstr="abcde";すべての機能の外部にある可能性があります。次に、動的に割り当てることなく、この文字列を渡すことができます。

于 2010-04-12T04:09:02.157 に答える
0

cstr代わりに使用するつもりだったと仮定するとcstrn...

を削除しないでくださいcstr。を削除する必要がありますshaved

deleteで割り当てられたメモリのみnew。そしてdelete[]、で割り当てられたメモリnew[]

shavedは単にメモリアドレスを保持する変数です。そのメモリアドレスをに渡して、メモリdelete[]を取り除きます。 shavedで割り当てられたメモリのメモリアドレスを保持しますnew[]

于 2010-04-12T04:09:29.570 に答える