0

假设我有这样的代码:

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

4 回答 4

10

如果您正在编写带有类的 C,那么您必须记录调用者负责释放内存。它不能在这个函数中被释放,因为你正在返回一个指向它的指针。

如果您正在编写 C++,那么生命就太短了,不能乱用原始指针。返回 astd::string以便自动管理内存。

于 2013-10-31T09:52:19.493 回答
3

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

当然,如果您将函数签名更改为返回 astd::string您将避免所有这些问题/问题。

于 2013-10-31T09:53:16.400 回答
2

在 C++ 中,您应该将函数的签名更改为 return std:string

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

你的问题就消失了。

而不是snprintf使用std::stringstream.

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

于 2013-10-31T09:53:35.103 回答
1

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

于 2013-10-31T09:58:02.610 回答