gpt4 book ai didi

c - 无法发现内存泄漏 cStringUsingEncoding

转载 作者:行者123 更新时间:2023-12-04 03:15:37 26 4
gpt4 key购买 nike

嘿,我正在尝试使用 cStringUsingEncoding 将 NSString 转换为 C 字符串,但我有内存泄漏。我的理解是 cStringUsingEncoding 返回一个指向字符数组的指针,该数组只保证在 NSString 对象的持续时间内存在。因此,您应该将其内容复制到另一个字符串。这就是我的问题所在......

我有一个接受 NSString 并将其转换为 C 字符串副本的函数。仅出于测试目的,我对以下方法进行了 1,000 次迭代(以确保没有泄漏)。

 -(void)test{
NSString *test = [[NSString alloc] initWithString:@"Hello world!"];

for(int i=0; i<1000; i++)
{
char *tmp = [self returnCopiedCString:test];

//free memory
free(tmp);
}

[test release];
}

非常简单的代码……问题是它会疯狂地泄漏。现在,在您下结论之前,我的 returnCopiedCString 函数工作得很好。我通过声明和复制 C 字符串来测试它,以排除出现问题的可能性。在函数内部,我使用以下代码对其进行转换

 -(char *)returnCopiedCString:(NSString *)input{
//retain input
[input retain];

//get length of encoded C-string
int len = [input lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

//allocate memory for new C-string + null terminated byte
char *toReturn = (char *)malloc((sizeof(char) * len) +1);

//copy NSString to C-string
strcpy(toReturn,[input cStringUsingEncoding:NSUTF8StringEncoding]);

//release input
[input release];

//return pointer to newly copied string
return toReturn;
}

也很直接。然后我开始思考,也许是因为我在 for 循环之外声明了测试,因此它永远不会被释放,我将所有这些 const char* 从 cStringUsingEncoding 方法中保留下来。所以我将第一个函数更改为如下:

 -(void)test{
for(int i=0; i<1000; i++)
{
NSString *test = [[NSString alloc] initWithString:@"Hello world!"];

char *tmp = [self returnCopiedCString:test];

//free memory
[test release];
free(tmp);
}
}

但仍然没有运气。有没有人对这里可能出现的问题有任何想法?提前致谢!

最佳答案

来自文档:

The returned C string is guaranteed to be valid only until either the receiver is freed, or until the current autorelease pool is emptied, whichever occurs first. You should copy the C string or use getCString:maxLength:encoding: if it needs to store the C string beyond this time.

我认为 cStringUsingEncoding 正在为转换后的字符串分配内存以指定编码,并且您不保留接收器,因此如果您不使用自动释放池,则永远不会释放此内存。

关于c - 无法发现内存泄漏 cStringUsingEncoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3401674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com