为什么数据仍然存在于指针中,即使在返回值之前释放也是如此

时间:2017-09-07 11:54:21

标签: c++ free dynamic-memory-allocation

Dint找到我的答案的确切链接,所以在函数返回char *

的条件下询问这个简单的问题

我以这种方式编写代码,以便concat函数本身应该分配&释放记忆。

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

1)释放内存是否正确? (我跑Valgrind&也没发现任何问题)

2)如果指向“ptr”分配保持值,根据我的理解,如果释放一个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]!='\0')
    {
        ptr[j]=str1[i];
        printf("letter from src is %c\n",str1[i]);
        i++; j++;
    }
    i=0;
    while(str2[i]!='\0')
    {
        ptr[j]=str2[i];
        j++;i++;
    }
    ptr[j]='\0';
    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;
}

2 个答案:

答案 0 :(得分:1)

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);

然后在main中你可以使用你的结果。例如

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;
}

答案 1 :(得分:1)

当您致电ptr = malloc(/*size*/)时,系统会为您分配至少所请求大小的可用内存块;并且会返回此块开头的内存地址。

当你致电free(ptr)时,你告诉系统你不再需要那块内存。但是,在调用之后,您的指针仍将指向相同的内存地址。

free的实施取决于系统。在调用free(ptr)后访问此地址的内存是未定义的行为。