由于 char* 的旧用法已被弃用,您能不能不简单地使用字符串?
const char* func1 () {return "string literal";}
string func2 () {return "another string literal";}
这两个都可以正常工作,没有编译器警告。
然而
char* func3 () {return "yet another string literal";}
根本不会编译。也不会
char* func4 () {return &"a ref to a string literal?";}
Stroustrup 在“The C++ Programming Language”(第三版)中说:
“字符串文字是静态分配的,因此从函数返回一个字符串是安全的。
const char* error_message (int i)`
{
//...
return "range error";
}
调用 error_messages() 后,内存保持范围错误不会消失。”
因此,程序中的每个字符串文字都被分配在其自己的一小块内存中,该内存在程序运行期间持续存在(即静态分配)。将 const 放在 char* 前面让编译器知道您不打算(也不能)更改该字符串文字的一小块内存,这可能是危险的,因此尽管从字符串文字转换为 char*,他们还是让这个赋值滑动已弃用。
相反,返回到字符串必须将字符串文字复制到字符串类型的对象中,即调用者负责的内存。
无论哪种方式都没有内存泄漏:每个字符串文字都有自己的一块内存,在程序终止时被清理;return to const char* 返回一个指向文字内存的指针(知道你不能改变它);并返回一个字符串复制到调用者代码中存在的字符串对象,该对象由调用者清理。
虽然它看起来有点难看,但我猜他们离开 const char* 是为了保留便宜的替代品(不涉及副本)。