即使在返回值之前释放后,数据仍在指针中仍然存在



dint找到了我答案的确切链接,因此在函数返回char *

的何处,询问这个简单的问题

我以这种方式编写了代码,以便Concat函数本身应该分配&释放内存。

任何人都可以帮助解决这些问题:

1)放置内存是否正确放置?(我跑了Valgrind&也没有发现)

2)如何根据我的理解,如何分配的保存值,如果释放了PTR的内存,那么值也应该丢失的值呢?如果错了,请纠正我。

char * concat(char *str1, char *str2)
{
    char *ptr;
    ptr=(char*)malloc(strlen(str1)+strlen(str2)+1); //allocated+1 for NULL character as well
    int i=0,j=0;
    while(str1[i]!='')
    {
        ptr[j]=str1[i];
        printf("letter from src is %cn",str1[i]);
        i++; j++;
    }
    i=0;
    while(str2[i]!='')
    {
        ptr[j]=str2[i];
        j++;i++;
    }
    ptr[j]='';
    cout<<ptr;
    free(ptr);
    return ptr;
}
int main()
{
    char *str1="hello";
    char *str2="world";
    cout<<str1<<endl;
    cout<<str2<<endl;
    char *res=concat(str1,str2);
    return 0;
}

valgrind不抱怨,因为您在MAIN中不访问res。如果您确实阅读了res,那么我希望您会遇到valgrind错误,并且很可能会在更大的应用程序中崩溃。

您需要更改concat的末端以删除呼叫free,即

    cout<<ptr;
    return ptr;
}

也可以使用 strcat,即

,而不是手写循环
ptr=(char*)malloc(strlen(str1)+strlen(str2)+1);
strcat(ptr, str1);
strcat(ptr, str2);

然后,您可以使用结果。例如

int main()
{
    char *str1="hello";
    char *str2="world";
    cout<<str1<<endl;
    cout<<str2<<endl;
    char *res=concat(str1,str2);
    cout << "res from main: " << res << "n";
    free(res);
    return 0;
}

当您调用ptr = malloc(/*size*/)时,系统将至少由您要求的大小的自由存储器分配给您;并将此块开始的内存地址返回给您。

当您致电free(ptr)时,您正在告诉系统您不再想要那个内存的块。但是,您的指针仍将指向通话后的相同内存地址。

free的实现取决于系统。在您打电话给free(ptr)之后,在此地址访问内存是未定义的行为。

最新更新