DB-> put()を呼び出した後、メモリの割り当てを解除する際に問題が発生しました。私がそれをするとき、それは「ダブルフリーまたは腐敗」と言います。
コードサンプル:
DBT key,value;
int err;
...
memset(value,0,sizeof(DBT));
value.data=malloc(10);
memset(value.data,10);
value.flags=DB_DBT_MALLOC;
...
value.size=10;
...
if((err=db->put(db,NULL,&key,&value,0))){
...
}
free(value.data);
C APIリファレンスには、この件に関する情報は含まれていません。データを取得する(ただし、保存しない)ときにDB_DBT_MALLOCを使用することに関する情報のみが示されています。
このフラグが設定されると、Berkeley DBは返されたキーまたはデータ項目にメモリを割り当て(malloc(3)またはユーザー指定のmalloc関数を使用)、キーまたはデータDBTのデータフィールドにそのポインタを返します。構造。割り当てられたメモリは呼び出し元のアプリケーションの責任になるため、呼び出し元は、データフィールドの戻り値を使用してメモリが割り当てられたかどうかを判断する必要があります。
DB-> putが呼び出されると、Berkeley DBはデータを返さず、キーとデータのペアを格納するだけです。データをコピーしますか、それともDB->closeまたはENV->closeが呼び出されるまでメモリを存続させる必要がありますか?