回答
问题不包含足够的信息来告诉,这取决于什么呢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;
}
那么它不会不管你做什么,要求任何形式的delete
上str
没有影响。
资源的所有权以及如何释放所拥有的资源是函数接口的一部分,并且应在记录实际返回值的同时记录下来。
您忘记添加使用strdup或其他C API添加额外扭曲的选项。 – 2011-03-14 20:04:34
@Martin:true。我也没有提到'getStr()'返回一个指向与某个自定义引用计数共享实体关联的数据的指针,并且必须调用匹配的'freeStr()'函数来减少引用计数。 – 2011-03-14 20:06:19
确实;但是返回一个C-String指针的最常见的情况是来自一个C库,它将使用C字符串操作例程。在国际海事组织更有可能的情况比任何你上面假设(除了字符串文字)。 – 2011-03-14 20:23:37
如果超出范围,这样做是个好主意。我也建议设置指针为空,以确保它不会晃来晃去:
delete[] str;
str = null;
你的意思是删除[] str; ? – Timo 2011-03-14 20:01:14
我注意到并修复了它刚才的:) – BrMcMullin 2011-03-14 20:02:10
将指针设置为NULL是代码中其他问题的标志,并且随着RAII,它变得不必要。因此,我会在C++代码中反对它,因为它在开发过程中实际上隐藏了错误。当然,如果这是一个C问题,那么你的观点是有效的(但它仍然隐藏着问题)。 – 2011-03-14 20:08:33
这一切都取决于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];
}
还有许多其他的可能性。正如我前面所述,函数的合同(应该出现在它的文档中)的一部分是谁拥有返回的指针,以及如果这样做是调用者的责任,那么必须如何处理这些数据。
+1代替'free'提供可能性 – user470379 2011-03-14 20:01:20
这取决于如何设计getStr()
。它可以返回一个指向其他人仍然拥有的字符串的指针(在这种情况下答案是否定的),或者它可以返回一个指针并且调用者成为所有者(在这种情况下答案是肯定的)。
你应该检查文档getStr
知道。
如果返回区域的所有权是调用者的所有权,那么可能在C++中返回std::string
将是一个更好的主意。
- 1. 自动转换为const char []为const char *的模板函数
- 2. 解析为const char * argv的[]
- 3. 函数重载为const char *,const char(&)[N]和std :: string
- 4. C++为const char *为const char * const的
- 5. stl map <char*,char*>析构函数
- 6. const char *&作为函数参数C++
- 7. 与scanf函数用于为const char *
- 8. 将const char **传递给函数 - 如何构建char **?
- 9. 返回const char的函数*
- 10. 转const const wchar_t *为const char *
- 11. const char * const char **
- 12. 不能将'const char *'转换为'char * const *'
- 13. NSString为char(不是const char)
- 14. C抱怨通过char **值传递给char const * const * const函数,但C++不会
- 15. 复制构造函数将const从const转换为非const?
- 16. 如何将const char * const转换为const char *
- 17. 为const char *成员
- 18. 元帅为const char **
- 19. 为const char * Qt中
- 20. 从DWORD为const char *
- 21. NSInteger的为const char *
- 22. `const char *'到`char'
- 23. C++ char const char *
- 24. 如何为const WCHAR *转换为const char *
- 25. 如何为const char *转换为const WCHAR *
- 26. 使用std :: string构造函数复制const char *
- 27. 类'stat64'没有构造函数stat64(const char *,stat64 *)
- 28. 在Qt 4.7中强制调用QString(const char *)构造函数
- 29. 从C函数返回const char * *
- 30. 为const char *为char *在我的情况
这取决于getStr是否分配内存。 – Joe 2011-03-14 19:59:45
由于这个标签为'C++',所以你应该考虑使用'std :: string'。 – James 2011-03-14 20:01:50
除了所说的一切之外,你不能在const char * c字符串上调用*析构函数。你只能说,'delete'或者'free()'是。 :)/nit-picking – Xeo 2011-03-14 20:43:09