如何从函数返回字符串文字

sky*_*oor 7 c++ string return-type literals

关于从函数返回字符串文字或字符串我总是很困惑.我被告知可能存在内存泄漏,因为您不知道何时会删除内存?

例如,在下面的代码中,如何实现foo()以使代码的输出为"Hello World"?

void foo (       )              // you can add parameters here.
{

}

int main ()
{
    char *c;
    foo (    );
    printf ("%s",c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另外,如果返回类型foo()不是无效,但你可以返回char*,它应该是什么?

GMa*_*ckG 10

我假设我们无法修改main.为了使您的程序在没有泄漏的情况下工作,您需要具有静态存储的东西:

void foo(char*& pC)  // reference
{
    static char theString[] = "thingadongdong";

    pC = theString;
}
Run Code Online (Sandbox Code Playgroud)

但实际上,这不是非常传统的C++代码.你会使用std::stringstd::cout,所以你不要担心内存:

std::string foo(void)
{
    return "better thingadongdong";
}

int main(void)
{
    // memory management is done
    std::cout << foo() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果你想知道某些东西是否需要手动解除分配,那就错了.

  • 说到传统的C++代码,空参数列表中的`void`是多余的. (3认同)

小智 5

由于旧的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";
}
Run Code Online (Sandbox Code Playgroud)

调用error_messages()后,内存保持范围错误不会消失."

因此,程序中的每个字符串文字都分配在自己的小内存中,该内存持续一段时间(即静态分配).将const放在char*前面让编译器知道你不打算(也不能)改变那个字符串文字的小内存,这可能是危险的,所以尽管从字符串文字转换为char*,它们仍然允许这个赋值滑动已弃用.

返回到字符串必须将字符串文字复制到string类型的对象中,即调用者负责的内存.

无论哪种方式都没有内存泄漏:每个字符串文字都有自己的内存,在程序终止时清理; 返回const char*返回一个指向文字内存的指针(知道你不能改变它); 并返回一个字符串,将一个副本复制到调用者代码中存在的字符串对象中,该字符串对象由调用者清理.

虽然看起来有点丑陋的符号,但我猜他们离开了const char*以保留廉价替代品(不涉及副本).