2

さて、私は他の誰かのコードに取り組んでいます。彼らはこれをたくさんします:

char description[256];
description[0]=0;

これにより、文字配列の最初の場所に \0 が配置されることはわかっています。しかし、これは文字列を消去する安全な方法ですか?

また、Visual Studio はメモリ リークを報告し続けています。これは、使用されている文字列に関連付けられています。

Ps。はい、std::string について知っています。はい、それを使用します。これは私のコードではありません。

4

6 に答える 6

8

文字列を 0に初期化するには、次のようにします。

char description[256] = {0};

これにより、配列のすべての要素に 0 が割り当てられます。

最初の要素を0( '\0') に設定するだけでは、その内容は消去されません。文字列全体が null 文字に設定されることさえ保証しません。

他の人が述べたように、静的に作成されたオブジェクトは、関数が閉じられて放棄されるまで「消去」できません。技術的には、関数が放棄されても消去されません。スタック ポインターが変更されるだけです。データが消去されることに不安がある場合は、配列を反復処理して、各エントリを0( '\0') に設定する必要があります。

于 2008-11-20T14:17:24.113 に答える
8

char 配列の最初の要素を \0 に設定するだけで、'description' が適切にフォーマットされた実際の文字列であることを確認できます。要素 0 が 0 である限り、要素 1 から 255 はすべてガベージになる可能性があり、説明は長さゼロの文字列です。

上記のコードでは、配列がスタックに割り当てられるため、メモリ リークを心配する必要はありません。スタックから落ちる (範囲外になる) と、char 配列は割り当て解除されます。

于 2008-11-20T15:20:20.383 に答える
4

これまでに与えられた良い答えを明確にするために:

  • はい、description [0] = 0はstrxxx関数POWから文字列をクリアします:strlen(description)== 0、strcmp(description、 "")==0およびstd:: string(description)==""はすべてtrueです。

  • いいえ、description [0] = 0はfree(description)またはmemset(description、0、sizeof description)と同じものではありません。しかし、あなたはすでにそれを知っていました。

  • 引用したコードがメモリリークを引き起こす可能性はありません。メモリはヒープに割り当てられておらず、メモリリークはヒープの問題です。

于 2008-11-20T18:26:23.097 に答える
4

この文字列はスタックに割り当てられるため、呼び出された関数が戻るまで (自動的に行われる場合)、使用するメモリを解放する方法はありません。この関数を再帰的に呼び出す場合を除き*、これがメモリ リークになることはありません。関数が返されると、その領域は将来のスタック フレームに使用されるためです。また、セキュリティが心配な場合は、ループして文字列の要素をゼロにする必要があります。

free() 可能なメモリ ブロックが必要な場合は、次のようにして配列をヒープに割り当てることができます。

char *str = malloc(256*sizeof(char)); // str now is a pointer to a 256-char array
...
// some code here
...
free(str); // free the memory

※これは実際のメモリリークではありませんが、「メモリ不足」という意味で「メモリリーク」と言う人がいます。いずれにせよ、スタック スペースはヒープ スペースよりもはるかに限られているため、そこで使用するメモリ ブロックのサイズに注意する必要があります。

于 2008-11-20T13:54:59.120 に答える
3

文字列の最初の要素を挿入することは、文字列をクリア\0する安全な方法ですが、文字列を削除することとは異なり、メモリ リークを防ぐことはできません。

于 2008-11-20T13:56:04.580 に答える
1

それが char[] 文字列で、実行される操作が文字列関数だけであれば、問題ありません。もちろん、保護されたデータには十分ではありません。

メモリ リークに関しては、文字列関数の安全なバージョンに変更する価値があるかもしれませんが、静的またはスタック ベースの文字列をリークすることはできないため、おそらく文字列が渡される場所です。

わかりやすくするために、'\0' に変更します。

于 2008-11-20T13:57:15.810 に答える