在我的程序中,我有这样的行:
const char * str = getStr();
我是否需要在函数末尾的str []上调用析构函数以防止内存泄漏?
答案 0 :(得分:23)
问题不包含足够的信息,这取决于getStr()
的作用。例如:
const char *getStr() {
return "boo";
}
然后你一定不能调用delete。
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
都没有效果。
资源的所有权以及如何释放所拥有的资源是函数接口的一部分,并且应该在记录实际返回值的同时记录。
答案 1 :(得分:2)
这完全取决于getStr()
的作用。如果free
使用getStr()
创建了malloc
,则可能需要在指针上调用getStr()
。可能是getStr()
正在返回一个指向静态区域的指针(不是非常安全,但它会发生)或其他任何东西。
getStr()
的合同和文档的一部分应该是谁拥有它返回的指针。
以下是可能的getStr()
函数的一些示例......
在这种情况下,getStr()
拥有指针,您无需执行任何操作即可将其释放。 OTOH,当你下次打电话给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}}
还有很多其他可能性。正如我之前所说,函数合同的一部分(应该出现在其文档中)是谁拥有返回的指针以及如果这样做是调用者的责任,那么必须处理该指向的数据。
答案 2 :(得分:1)
这取决于getStr()
的设计方式。它可以返回一个指向仍然由其他人拥有的字符串的指针(在这种情况下答案是否)或者它可以返回指针并且调用者成为所有者(在这种情况下答案是肯定的)。 / p>
您应该查看getStr
的文档以了解。
如果返回区域的所有权属于调用者,则可能在C ++中返回std::string
会更好。
答案 3 :(得分:0)
如果超出范围,最好这样做。我建议还将指针设置为null以确保它不是悬空:
delete[] str;
str = null;