内存分配和内存泄漏:C

时间:2016-02-11 01:18:26

标签: c arrays memory memory-management memory-leaks

我是C的新手。我有一个名为kstrfrom的函数需要创建并返回一个新的kstring对象,该对象包含一个以null结尾的C字符串的内容副本,包括空终止符。 / p>

返回的kstring的.length成员应该是cstr的长度,加上null终止符的长度。 .data成员应该是指向新分配的内存的指针,你已经复制了cstr的内容,包括最后的空字节。

如果分配内存时出错,则此函数应调用abort()或抛出未捕获的异常。

Locale loc = new Locale("ar");
/*  under API 20 */
tts.setLanguage(loc);

/* over API 21 */
String voiceName = loc.toLanguageTag();
Voice voice = new Voice(voiceName, loc, Voice.QUALITY_HIGH, Voice.LATENCY_HIGH, false, null);
tts.setVoice(voice);

我已经运行了一些测试用例:

TextToSpeech

正如您所见,我需要帮助提供正确的链接,包含正确的数据和复制数据。

1 个答案:

答案 0 :(得分:1)

结束时
    while(*cstr!='\0')
    {
        cstr+=1;
        length+=1;
    }

你丢失了cstr的初始值

    int length=1;    
    char * tmp = cstr;
    while(*tmp!='\0')
    {
        tmp+=1;
        length+=1;
    }

您没有设置长度成员......

cdest.length = length + 1;

返回kstring是有问题的。

kstring res;
res = kstrfrom( "My String" ); /* works */
kstrfrom( "Another string" );  /* leaks memory */

其他评论描述了您如何忽略语言功能。 使用...可以更轻松地实现代码。

kstring kstrfrom(const char *cstr)
{
    kstring cdest={NULL,0};
    cdest.data = strdup( cstr );
    if( cdest.data == NULL ){
         abort();
    }
    cdest.length = strlen( cstr ) + 1;  /* not done in original example */
    return cdest;
}
相关问题