【发布时间】:2016-02-18 05:55:43
【问题描述】:
我是 C++ 新手,对内存泄漏有偏执。我将把我的代码精简到最重要的部分:
如果我有这样的功能:
char * myString = "Discombobulate";
char * ToUppercase()
{
int length = strlen(myString);
char * duplicateString = new char [length];
strcpy(duplicateString, myString);
//char arithmetic to turn every letter in duplicateString to uppercase
return duplicateString;
}
显然,我需要执行 delete[] 以避免内存泄漏。现在我想知道我是否可以在 main() 中进行删除,如下所示:
int main () {
char * result = Upper();
std::cout << result << std::endl;
delete[] result;
}
这会正常工作吗?这样做有什么问题吗?
【问题讨论】:
-
为什么在 C++ 中使用
char*而不是std::string?此外,您的函数名称不匹配。 -
使用 RAII 成语。返回具有将管理此类资源的值语义的类。在这种情况下,只需返回
std::string。 -
strcpy(duplicateString, myString);是未定义的行为,duplicateString是一个字符太短(空字符没有空间),以防万一您需要另一个使用std::string的理由。 -
糟糕的例子我知道,我在大约 2 秒内输入了它。
-
如果您对内存泄漏有疑虑,您应该坚持使用当代 C++。在资源周围使用 RAII 包装器,例如std::vector 而不是 C 风格的数组。如果您从一本书中学习,并且它在 C 数组之后引入了 std::vector 或在 C 字符串处理之后引入了 std::string,我会把它扔掉。