2011-03-14 29 views
7

在我的节目,我有这样一行:析构函数上为const char *

const char * str = getStr(); 

我是否需要调用STR [1]在析构函数结尾以防止内存泄漏?

+3

这取决于getStr是否分配内存。 – Joe 2011-03-14 19:59:45

+7

由于这个标签为'C++',所以你应该考虑使用'std :: string'。 – James 2011-03-14 20:01:50

+0

除了所说的一切之外,你不能在const char * c字符串上调用*析构函数。你只能说,'delete'或者'free()'是。 :)/nit-picking – Xeo 2011-03-14 20:43:09

回答

23

问题不包含足够的信息来告诉,这取决于什么呢getStr()。例如:

const char *getStr() { 
    return "boo"; 
} 

那么你不得呼叫删除。

const char *getStr() { 
    return new char; 
} 

,那么你应该叫delete str;,以避免内存泄漏(而不能调用delete[])。

const char *getStr() { 
    return new char[10]; 
} 

,那么你应该叫delete[] str;以避免内存泄漏(而不能调用delete)。

const char *getStr() { 
    return 0; 
} 

那么它不会不管你做什么,要求任何形式的deletestr没有影响。

资源的所有权以及如何释放所拥有的资源是函数接口的一部分,并且应在记录实际返回值的同时记录下来。

+0

您忘记添加使用strdup或其他C API添加额外扭曲的选项。 – 2011-03-14 20:04:34

+0

@Martin:true。我也没有提到'getStr()'返回一个指向与某个自定义引用计数共享实体关联的数据的指针,并且必须调用匹配的'freeStr()'函数来减少引用计数。 – 2011-03-14 20:06:19

+0

确实;但是返回一个C-String指针的最常见的情况是来自一个C库,它将使用C字符串操作例程。在国际海事组织更有可能的情况比任何你上面假设(除了字符串文字)。 – 2011-03-14 20:23:37

0

如果超出范围,这样做是个好主意。我也建议设置指针为空,以确保它不会晃来晃去:

delete[] str; 
str = null; 
+0

你的意思是删除[] str; ? – Timo 2011-03-14 20:01:14

+0

我注意到并修复了它刚才的:) – BrMcMullin 2011-03-14 20:02:10

+1

将指针设置为NULL是代码中其他问题的标志,并且随着RAII,它变得不必要。因此,我会在C++代码中反对它,因为它在开发过程中实际上隐藏了错误。当然,如果这是一个C问题,那么你的观点是有效的(但它仍然隐藏着问题)。 – 2011-03-14 20:08:33

2

这一切都取决于getStr()做什么。如果getStr()使用malloc创建它,甚至可能需要在指针上调用free。它可能是getStr()返回一个指向静态区域的指针(不是线程安全的,但它发生)或任何其他的事情。

getStr()的合同和文档的一部分应该是谁拥有它返回的指针。

以下是可能的getStr()功能的一些例子...

在这种情况下getStr()拥有指针和你没有做任何事情来释放它。OTOH,什么东西被指向可以改变下你叫getStr()时间,所以你应该让自己的副本,如果你需要保持它周围的任何时间长度:

const char *getStr() 
{ 
    static char buf[30] = "Silly counter"; 

    buf[0] = buf[0] + 1; 
    return buf; 
} 

在这种情况下,你将最终需要调用free上返回的指针:

const char *getStr() 
{ 
    return strdup("Silly string"); 
} 

在这种情况下,你需要对指针调用普通的老delete退换:

const char *getStr() 
{ 
    return new char; 
} 

在这种情况下,您将需要调用delete []上返回的指针:

const char *getStr() 
{ 
    return new char[50]; 
} 

还有许多其他的可能性。正如我前面所述,函数的合同(应该出现在它的文档中)的一部分是谁拥有返回的指针,以及如果这样做是调用者的责任,那么必须如何处理这些数据。

+0

+1代替'free'提供可能性 – user470379 2011-03-14 20:01:20

1

这取决于如何设计getStr()。它可以返回一个指向其他人仍然拥有的字符串的指针(在这种情况下答案是否定的),或者它可以返回一个指针并且调用者成为所有者(在这种情况下答案是肯定的)。

你应该检查文档getStr知道。

如果返回区域的所有权是调用者的所有权,那么可能在C++中返回std::string将是一个更好的主意。