0

我在我的 iPhone 应用程序中使用 ac lib。c lib 是由我无权访问的人编写的。

但是,我收到对象 0xa6000d 正在被释放但未分配的错误。调试变量截图在这里。

在此处输入图像描述

struct GtsMsg 定义为,

struct msg {
    int offset;
    int dataLength;
    u8* data;
    cBool expandable;
    cBool owned;
    u8* mid2key;
};

#define GtsMsg struct msg


void freeMessageData(GtsMsg* msg) {
    if (msg == NULL) return;
    if (msg->owned) {
        if (msg->data != NULL) {
            free(msg->data);
        }
    }
    free(msg->mid2key);
    memset(msg, 0, sizeof(GtsMsg));
}

malloc_error_break 的断点是free(msg->data) 行。

我添加了检查 if (msg->data != NULL),但它不起作用。有什么方法可以检查 msg->data 或 msg 的内存是否已分配?

您认为 *data = (u8)'\0' 处有什么可疑之处吗?

提前致谢!

4

1 回答 1

0

感谢大家的建议。感谢 hmjd 的提示。

我发现该结构用于 cpp 类中,该类的析构函数调用 freeMessageData。但我找不到该结构已初始化。因此,如果我在声明中将结构初始化为 NULL,则可以避免空闲内存问题并且不会崩溃。

这是 simonc 建议的。如果他将其写为答案,请发表评论,我可以接受。

从评论中hmjd

检查 NULL 是没有用的,因为如果传递给它的指针是 NULL,free() 将是一个空操作。仅仅因为一个指针不是 NULL 并不意味着它指向一个有效的内存位置(内存可能已经被释放或者指针从未初始化为 NULL)。程序员有责任在尝试释放指针之前确保指针有效。

于 2013-02-15T12:21:08.527 回答