「 strcpy 」で作成された文字列は解放する必要がありますか? そして、それを解放する方法は?
編集:宛先は次のように割り当てられます:
char* buffer[LEN];
strcpy
それ自体は宛先文字列にメモリを割り当てないので、解放する必要はありません。
もちろん、他の何かがそれにメモリを割り当てていた場合、はい、そのメモリは最終的に解放されるはずですが、それは とは何の関係もありませんstrcpy
。
定義は文字の配列ではなく文字ポインターの配列であるため、前のステートメントが当てはまるようです。
char* buffer[LEN];
そして、それはほぼ確実に次のように行われます:
buffer[n] = malloc (length);
malloc されたメモリの責任という観点から考え始めることをお勧めします。つまり、malloc されたメモリ ブロックを渡すと、ある時点でそれを解放する責任を渡すことも必要になる場合があります。
メモリを管理する責任がメモリ自体に付随するかどうかを判断する (またはそれが自分のコードである場合は決定する) 必要があるだけです。を使用strcpy
すると、宛先に既に malloc されたブロックを渡しても、責任は渡されないため、そのメモリを自分で解放する必要があります。これにより、malloc されたバッファまたは malloc されていないバッファを心配することなく簡単に渡すことができます。
strdup
基本的に、最初にメモリを割り当てて文字列のコピーを作成することを考えているかもしれません。そこから返された文字列は、確実に解放する必要があります。
使用する場合
char buffer[6];
strcpy(buffer, "hello");
たとえば、スコープの最後に達するとバッファが解放されます。
一方で、
char *buffer;
buffer = malloc(sizeof(char) * 6);
strcpy(buffer, "hello");
このようにして、割り当てたメモリを解放する必要があります。
しかし、実際には strcpy とは何の関係もありません。文字列をどのように割り当てるかについてのみです。
strcpy の宛先バッファーへのポインターを提供するため、そのバッファーを解放する必要があるかどうか、および解放する方法については、そのバッファーをどのように割り当てたかによって異なります。
たとえば、malloc を使用してバッファを割り当てた場合は、解放する必要があります。スタックにバッファを割り当てた場合は、割り当てられません。範囲外になると自動的に解放されます。
このstrcpy
関数は、別の方法 ( などmalloc
) を取得するために必要なバッファーに文字列をコピーします。割り当て方法に適したメカニズムを使用して、そのバッファーを解放する必要があります。
strcpy()
文字列を作成せず、文字列をコピーするだけです。メモリ割り当ては、そのプロセスから完全に分離されています。
そのため、文字列がコピーされるメモリに注意する必要があります。動的に割り当てられた場合は、ある時点で解放する必要があります。スタックに割り当てられたバッファがあるように見えるので、特別なことをする必要はありません - バッファは範囲外になると回収されます。