函数返回char*

Ale*_*ecs 1 c++ char

编写一个返回char*的函数是否正确?

像这样的东西:

char * func()
{  
 char *c = new char[3];
 strcpy(c, "hi");
 c[2] = '\0';
 return c;
}

int main()
{
 char *c;
 c = func();
 //code using c
 delete [] c;
 return 1;
}
Run Code Online (Sandbox Code Playgroud)

它有效,但它是否正确?

Mat*_*lia 6

它是正确的(假设你的意思strcpy而不是strlen),但是从函数的文档中必须非常清楚,调用者有责任释放返回的指针,以及它必须使用什么方法来释放它(new=> delete,new []= > delete[],malloc=> free等).这是做到这一点的"C方式".

这依赖于你的函数的用户(包括你在写完几个月之后)来阅读文档以使事情正确,因此它非常容易出错; 此外,在C++中还有一些不存在于C中的并发症(即:异常),这些并发症使得在这些上下文中使用原始指针并不是一个好主意.

这就是为什么你通常应该返回封装资源的类(例如,std::string在这种情况下,通常是自动管理内存的容器)或所有权转移智能指针的原因,这也是异常安全的优势(你的代码是不).

这听起来非常复杂,但实际上并非如此:

#include <string>

std::string func()
{  
   return "hi"; // actually, to be more explicit it should be return std::string("hi")
}

int main()
{
    std::string c;
    c=func();
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

就是这样,不需要担心分配/解除分配和异常,所有这些都由std::string类自动处理,因此您可以管理字符串,就像它们内置类型一样.

  • 是的,这正是Matteo Italia提到这些东西的原因. (2认同)