编写一个返回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)
它有效,但它是否正确?
它是正确的(假设你的意思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类自动处理,因此您可以管理字符串,就像它们内置类型一样.
| 归档时间: |
|
| 查看次数: |
7027 次 |
| 最近记录: |