在方法C / C ++中释放动态分配的char *

时间:2013-10-31 09:48:55

标签: c++

假设我有这样的代码:

char* Complex::getString(void)
{   
        char *p;
        int n = snprintf( NULL, 0, "%.6f+%.6fi", (float)_re, (float)_im);
        p = (char*)malloc(n+1);
        sprintf( p,  "%.6f+%.6fi", (float)_re, (float)_im);

        return p;
}

我应该释放p,如果是的话 - 在哪里以及为什么?

4 个答案:

答案 0 :(得分:10)

如果您正在编写C With Classes,那么您必须记录调用者负责释放内存。它无法在此函数中释放,因为您将返回指针。

如果你正在编写C ++,那么生活对于搞乱原始指针来说太短暂了。返回std::string,以便自动管理内存。

答案 1 :(得分:3)

如果你malloc你应该考虑释放它,否则你就会有泄漏。 哪里?好吧,不在函数内部,因为返回值对调用者没用。调用者必须控制指针并在完成时释放它。这将使编写异常安全代码变得困难。

当然,如果您更改了功能签名以返回std::string,则可以避免所有这些问题/问题。

答案 2 :(得分:2)

在C ++中,您应该更改函数的签名以返回std:string

std::string Complex::getString(void);

你的问题已经消失了。

而不是snprintf使用std::stringstream

如果你想使用malloc,在任何情况下都不推荐在C ++程序中使用,那么显然释放内存的责任在于调用者。在将函数返回给调用者之前,您的函数无法释放为字符串分配的内存。您应记录此信息,以便用户知道他们必须这样做。但是你的代码(包括你自己)的用户经常会忘记它并且内存会泄漏。此外,在这种情况下,客户端代码变得更复杂,这不是很好。

答案 3 :(得分:1)

当你不需要那个指针时,你应该释放函数调用者代码中函数Complex :: getString返回的指针。