我遇到了一个有趣的问题。
我有这段代码(不要问为什么我需要做这样的事情):
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逻辑)。如果我错了,请纠正我。
答案 0 :(得分:1)
在这种情况下,您从sizeof(SSLContextRef)
指向的CFDataRef
复制了data
个字节的数据,您没有增加任何引用计数,也没有复制除SSLContext
以外的任何数据指向SSLContextRef
结构的指针。 (struct SSLContext
被声明为指向sslContext
)的指针。
您复制的数据最终会出现在当前堆栈框架的{{1}}中,因此您不需要任何特殊的策展就可以让它消失。
简而言之,您不需要执行任何操作,因为堆中没有复制数据。