假设我有这样的代码:
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,如果是的话 - 在哪里以及为什么?
答案 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返回的指针。