1. ホーム
  2. c++

[解決済み] glibc が検出された : 二重の空きまたは破損

2022-02-20 14:10:38

質問

私が行った簡単なコーディングの手順と、問題に直面している領域を説明します。

main.cpp

int main()
{
    int cnt_map,i=1,value;

   /* My question is about this char pointer "key" */ 
    char *key =(char*)malloc(sizeof(char) * 25);

   if(key!=NULL)
   {
     printf("Key value is not NULL,its value is:%x\n",key) ;
     cout<< "Enter the number of elements required in container map"<<endl;
     cin >> cnt_map;
     for (i=1;i<=cnt_map;i++)
     {
       cout << "Enter the key : ";
       cin >>key;
       cout << "Enter the key value:" ;
       cin >>value;
       printf("value pointed by ptr key: %s, value in ptr: %x\n", key,key);
       c -> add_map1(key,value); //Function inserts value to map container
       key+=sizeof(key);
     }
     c -> size_map1();           //Function displays size of map container
     c -> display_map1();        //Function displays contents of map container
  if(key)
  {
    printf("FINALLY:value pointed by ptr key: %s, value in ptr: %x,size:%d\n",key, key, sizeof(key));
    free(key);
  } 
 }
return 0;
}

上記のコードをコンパイルして実行しようとしたところ、コンパイルには成功しましたが、アプリケーションを実行しようとすると "glibc detected : double free or corruption" が表示されました。

そこで質問なのですが、charポインタ( char *key =(char*)malloc(sizeof(char) * 25); ) で、malloc を使ってうまくメモリを割り当てました。処理が完了した後、そのcharポインタをfreeしようとすると、double free or corruptionエラーが発生します。malloc/callocでメモリを割り当てた変数は、最終的に解放する必要があることを知りました。なぜこのようなエラーが出るのか、なぜこのようなことをしてはいけないのか教えてください。メモリ操作はどのように行われるのですか? char* key (可能であれば絵で)説明してください。

注:上記で紹介したコードは完全なコードではなく、問題が発生している箇所を説明しただけです。 ポインター変数を解放していなければ、私のアプリケーションは正常に動作しています。

解決方法は?

それは、この行のせいです。 key+=sizeof(key); . key と同じアドレスは含まれません。 malloc が返される。

例えば

char *key =(char*)malloc(sizeof(char) * 25);

mallocが次のようなアドレスを返すとしよう。 20000 (全く馬鹿なアドレスです。例として挙げただけです)。

今、あなたがやっているのは key+=sizeof(key); ということで、key = 20000 + 4 = 20004 となります。問題なのは、あなたが解放しようとしている key これは、20000ではなく、20004のアドレスを指しています。

それを解決するために、次のことを試してみてください。

int main()
{
    int cnt_map,i=1,value;
    char *key_save;

   /* My question is about this char pointer "key" */ 
    char *key =(char*)malloc(sizeof(char) * 25);

    key_save = key;
   if(key!=NULL)
   {
     printf("Key value is not NULL,its value is:%x\n",key) ;
     cout<< "Enter the number of elements required in container map"<<endl;
     cin >> cnt_map;
     for (i=1;i<=cnt_map;i++)
     {
       cout << "Enter the key : ";
       cin >>key;
       cout << "Enter the key value:" ;
       cin >>value;
       printf("value pointed by ptr key: %s, value in ptr: %x\n", key,key);
       c -> add_map1(key,value); //Function inserts value to map container
       key+=sizeof(key);
     }
     c -> size_map1();           //Function displays size of map container
     c -> display_map1();        //Function displays contents of map container
  if(key)
  {
    printf("FINALLY:value pointed by ptr key: %s, value in ptr: %x,size:%d\n",key, key, sizeof(key));
    free(key_save);
  } 
 }
return 0;
}