函数返回后,指向字符串文字的指针是否仍然有效?

时间:2009-10-19 14:24:52

标签: c++ pointers standards

以下函数返回的指针是否有效?

const char * bool2str( bool flg )
{
    return flg ? "Yes" : "No";
}

它在Visual C ++和g ++中运行良好。 C ++标准对此有何看法?

4 个答案:

答案 0 :(得分:25)

关于存储时间:

  

<强> 2.13.4   普通字符串文字和UTF-8字符串文字也称为窄字符串文字。一个箭头   string literal的类型为“const of n const char”,其中n是下面定义的字符串的大小,并且具有   静态存储时间

与3.7.1一起阅读

  

<强> 3.7.1。

     

所有没有动态存储持续时间的对象,没有线程存储持续时间,并且是   不是本地有静态存储持续时间。这些物体的存放时间应为   程序(3.6.2,3.6.3)。

在类型:

  

附件C

     

子条款2.13.4:

     

更改:字符串文字构成了const   字符串文字的类型从“char of char”更改为“const char数组”.a的类型   char16_t字符串文字从“some-integer-type”数组更改为“const char16_t数组”。   char32_t字符串文字的类型从“some-integer-type”数组更改为“const char32_-数组”   t。“宽字符串文字的类型从”wchar_t数组“更改为”const wchar_t数组。“

     

基本原理:这可以避免调用不合适的重载函数,这可能会导致   修改其论点。

     

对原始功能的影响:更改定义明确的功能的语义。   转换难度:简单的句法转换,因为字符串文字可以转换为   字符*; (4.2)。最常见的情况由新的但已弃用的标准转换处理:   char * p =“abc”; //在C中有效,在C ++中已弃用   char * q = expr? “abc”:“de”; //在C中有效,在C ++中无效

     

广泛使用:有合理理由将字符串文字视为潜在指针的程序   可修改的记忆可能很少见。

动态分配(单词'heap'从未在标准中的内存AFAIK区域的上下文中使用)内存需要一个函数调用,该函数调用可以在分配静态内存后很早就发生main

答案 1 :(得分:13)

此代码完全有效且符合要求。唯一的“问题”是确保调用者不会尝试释放字符串。

答案 2 :(得分:12)

此代码有效且符合标准。

字符串文字存储在只读存储器中,该函数只获取所选字符串的地址。

C ++标准(2.13.4)说:

  

普通的字符串文字有类型   “n const char数组”和静态   存储时间

他们关键在于理解你的问题,是静态存储持续时间:在程序启动时分配字符串文字,在程序持续时间内持续。你的函数只获取地址并返回它。

答案 3 :(得分:5)

技术上是的,它是有效的 字符串有静态存储durataion。

但这不是整个故事。

这些是C-Strings。 C-Library和函数中的约定是返回应该被释放的动态分配的字符串。即返回的指针隐式将所有权返回给调用者(因为在C中也有例外)。

如果您不遵守这些惯例,您会混淆许多有望参加此类惯例的经验丰富的C开发人员。如果您不遵循此标准期望,则应在代码中详细记录。

这也是C ++(根据你的标签)。因此返回std :: string更为常规。这样做的原因是只通过指针传递所有权(这导致C代码中的许多错误,上述期望被打破但记录在案,遗憾的是文档从未被代码用户读取)。通过使用std :: string,你传递一个对象,它们不再是所有权的问题(结果作为一个值传递回来,因此你的传递回来),但因为它是一个对象,所以没有资源分配的问题或问题

如果你担心效率,我认为这是一个虚假的问题。

如果您希望通过流进行打印,那么已经有了一个标准惯例:

std::cout << std::boolalpha << false << std::endl;
std::cout << std::boolalpha << true  << std::endl;