从函数返回动态数组后将其删除

Deleting a dynamic array after it has been returned from a function

本文关键字:删除 数组 函数 返回 动态      更新时间:2023-10-16

我是记忆泄漏的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;
}

这能正常工作吗?这样做有什么好处吗?

现在我想知道的是我是否可以在main()中进行删除

是的,你可以而且你应该。

BTW1:考虑使用std::stringstd::vector智能指针,以避免这种手动内存管理,因为它是c ++。

顺便说一下2:

char * duplicateString = new char [length];

应该是

char * duplicateString = new char [length + 1];

最后一个位置将用于终止空字符''

这能正常工作吗?

是的。只要它是有效的指针,您就可以在调用 new 的函数之外delete它。你应该吗?井。。。

这样做有什么好处吗?

是的。这是不好的做法。您正在函数中分配资源,并期望调用方清理它们。正如评论中的人所解释的那样,这与RAII背道而驰。除了使用std::string的建议(确实使用它)外,您还可以使用std::unique_ptr和朋友而不是原始指针。

是的,您可以按照自己的方式删除它...顺便说一下,您还可以为指针分配内存并将其作为参数传递给函数,并在它从函数返回后将其删除。

char * duplicateString = new char [length + 1];
ToUppercase(char* duplicateString );
if( duplicateString ){ delete []duplicateString  ; duplicateString  = NULL;}