2

関数内に割り当てられたメモリを返そうとしています。

私がここに書いた (そしてテストしなかった) ものに明らかな問題がないと仮定すると、メモリはどのように解放され、解放されないのでしょうか? free(bob)彼はスタックではなくヒープにいるので、後でする必要がありますよね?

ちょうど今、別の受け入れられた回答でCの参照カウントについて何かを読みましたが、Cにガベージコレクターのようなものがあることを本当に覚えていません。

char* strCat5000(char *fmt, ...)
{
  char buff[5000];
  char *ret_;
  va_list arg_ptr;
  va_start(arg_ptr, fmt);
  vsnprintf(buff, sizeof(buff), fmt, arg_ptr);
  va_end(arg_ptr);
  //ret_ = malloc((char*)(strlen(buff)+1)*sizeof(char)); //Allocated inside function
  ret_ = (char*)malloc((strlen(buff)+1)*sizeof(char)); //moved (char*) .. typo
  ret_ = strcpy(ret_,buff);
  return (ret_);
}
...
void findBob()
{
  char * bob;
  bob = strCat1000("Server is %s for %d seconds.", "on fire", 35329);
  printf("%s", bob);
  free(bob); //bob needs to be freed here or he'll leak when findBob ends???
}
4

4 に答える 4

1

上記の問題を処理するには、2 つのアプローチがあります。

1つ目はあなたがしていることです。それはfree使用後のボブです.cには何もないからですautomatic.

2番目は、結果を保存したい場所に渡すことができますparameter(としましょう)。その場合、スタック上にあり ( 内で宣言する必要があります)、終了後に自動的に割り当て解除されます。strCat1000store_varstore_varfindBobfindBob

から解放したい場合はfree、コードを から解放してくださいmalloc

このようなものはうまくいくかもしれません:

void findBob()
{
  char store_var[1000];
  strCat1000(store_var,"Server is %s for %d seconds.", "on fire", 35329);
  ...

void strCat1000(char to_save[],char *fmt, ...)
{
  ret_ = strcpy(to_save,buff); //check for lengths also.
  ...
于 2013-10-12T18:43:39.327 に答える