从函数

时间:2016-02-18 05:55:43

标签: c++ memory dynamic

我是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;
}

这会正常吗?这样做有什么好处吗?

3 个答案:

答案 0 :(得分:4)

  

现在我想知道的是我是否可以在main()

中进行删除

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

BTW1:考虑使用std::stringstd::vectorsmart pointers来避免这种手动内存管理,因为它是c ++。

BTW2:

char * duplicateString = new char [length];

应该是

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

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

答案 1 :(得分:2)

  

这会正常运作吗?

是。只要它是一个有效的指针,你就可以delete在调用new的函数之外。你应该?嗯......

  

这样做有什么捕获吗?

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

答案 2 :(得分:1)

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

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

ToUppercase(char* duplicateString );

if( duplicateString ){ delete []duplicateString  ; duplicateString  = NULL;}