c 関数内で割り当てられたオブジェクトのメモリを (objective-c コードで) 解放しようとすると、「malloc: *オブジェクト 0xbfffe160 のエラー: 解放されるポインターが割り当てられませんでした」というメッセージが表示されます。この C 関数は、後で NSData として使用されるバイナリ データ パケットを作成して返します。これは、構造体変数を作成し、C 関数への参照によって渡す私の obj-c コード部分です。
MyPacket packetRef;
allocAuthentificationCodePacket(&packetRef);
NSData *data = [NSData dataWithBytes:packetRef.bytes length:packetRef.packet->packetSize];
free(&packetRef); // getting error
データは NSData 変数によって保持される必要があるため、メモリを解放しようとしていることを除いて、すべて正常に動作します。C 関数は内部で calloc を実行するため、何らかの方法でそのメモリを解放する必要があります。
packetRef->bytes = calloc(1, sizeof(*packetRef));
バイナリデータを格納するための私の構造体は次のとおりです。
typedef struct {
uint8_t packetType;
uint16_t packetBody;
} MyStruct;
および別の構造体:
typedef union {
const uint8_t *bytes;
MyStruct *packet;
} MyPacket;
メモリを解放するにはどうすればよいですか? 私が得ているエラーはクラッシュではなく、単体テストを実行しているときにデバッグ コンソールに表示されるメッセージです。
更新します。「bytes」構造体メンバーを解放しようとしましたが、同じエラー メッセージが表示されました。
free(&packetRef.bytes);
UPDATE2。ありがとう、提案された方法は機能し、コンソールからmallocエラーメッセージが消えました:
free(packetRef.bytes);
ただし、Xcode で「'const uint8_t *' (別名 'const unsigned char *') をタイプ 'void *' のパラメーターに渡すと、修飾子が破棄されます」という警告が表示されます。Apple LLVM 4.1 コンパイラを使用しています。C関数は別のファイルにあり、Androidの人はそれを再利用する必要があるため、ヘッダーのみが含まれています.
UPDATE3 . 構造体メンバー「bytes」にconstがあることを指摘してくれた@simoncと@nosに感謝します。const を削除すると、警告が消えました。const を使用する最初のアイデアは、「バイト」を変更から保護することでした。