我遇到了一个有趣的问题。
我有这段代码(不要问我为什么需要做这样的事情):
CFDataRef data = ... get data from somewhere
SSLContextRef sslContext;
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8 *)&sslContext);
现在我不知道如何处理 sslContext
。据我所知,我已经制作了 SSLContextRef 的字节副本,我需要在使用后释放该内存。
那么问题来了:如何正确释放内存?
同样,据我所知,我不能执行 CFRelease,因为当我得到(复制)对象时我没有增加引用计数,如果我只是尝试执行 free(sslContext)
我会崩溃.
如果有人能解释它应该如何工作,我将不胜感激。
编辑:感谢用户 gaige。他指出,在问题中我只复制了对 SSLContextRef 的引用。据我了解,如果我这样做:
UInt8 *buffer = malloc(sizeof(SSLContext));
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContext)), buffer);
然后我可以毫无问题地执行 free(buffer);
(前提是我没有执行任何 CFRetain/CFRelease 逻辑)。如果我错了,请纠正我。
最佳答案
在这种情况下,您从 data
指向的 CFDataRef
复制了 sizeof(SSLContextRef)
字节的数据,您没有增加任何引用计数,除了指向 SSLContext
结构的指针之外,您也没有复制任何数据。 (SSLContextRef
声明为指向 struct SSLContext
的指针)。
您复制的数据最终位于当前堆栈框架的 sslContext
中,因此不需要您进行任何特殊管理即可使其消失。
简而言之,您不需要做任何事情,因为没有数据被复制到堆中。
关于ios - 内存管理。 CF 对象的字节副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550777/