尝试释放在 c 函数内部分配的对象的内存(在 Objective-c 代码中)时,我收到“malloc:*对象 0xbfffe160 的错误:未分配被释放的指针”。这个 C 函数创建并返回二进制数据包,稍后用作 NSData。这是我的 obj-c 代码部分,我在其中创建结构变量并通过引用 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;
我应该如何释放内存?我得到的错误不是崩溃,它只是运行单元测试时调试控制台中的一条消息。
更新。试图释放“字节”结构成员但得到相同的错误消息:
free(&packetRef.bytes);
更新2。谢谢,建议的方法确实有效,并且 malloc 错误消息从控制台中消失了:
free(packetRef.bytes);
但是,在 Xcode 中收到警告“将 'const uint8_t *' (aka 'const unsigned char *') 传递给 'void *' 类型的参数会丢弃限定符”。我正在使用 Apple LLVM 4.1 编译器。C 函数驻留在单独的文件中,并且只包含一个标头,因为 Android 人员将不得不重用它。
更新3。感谢@simonc 和@nos 指出结构成员“bytes”具有常量。删除 const 后警告消失了。使用 const 的最初想法是保护“字节”不被修改。