const char *上的析构函数

时间:2011-03-14 19:56:15

标签: c++ destructor

在我的程序中,我有这样的行:

    const char * str  = getStr();

我是否需要在函数末尾的str []上调用析构函数以防止内存泄漏?

4 个答案:

答案 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;