C++ 返回字符数组作为std:string

C++ 返回字符数组作为std:string,c++,C++,如果没有显式强制转换或调用std::string构造函数,以下内容是否安全?如果不安全,为什么不呢 std:string myfunc() { char buf[128] = ""; // put something into buf or not base on logic. return buf; } 对。那很好。调用者将获得本地缓冲区的副本,因为std::string将从该本地缓冲区生成深度副本 编辑:我假设buf是以null结尾的字符串

如果没有显式强制转换或调用std::string构造函数,以下内容是否安全?如果不安全,为什么不呢

std:string myfunc()
{
    char buf[128] = "";
    // put something into buf or not base on logic.

   return buf;
}

对。那很好。调用者将获得本地缓冲区的副本,因为
std::string
将从该本地缓冲区生成深度副本


编辑:我假设
buf
是以null结尾的字符串字符数组,这非常重要。考虑下面的代码:

#include <string.h>
#include <iostream>
#include <string>

std::string alloc_string(bool fill)
{
    char buf[128] = ""; // Proper declaration/initialization of the array. 

    if (fill)
    {
        strcpy(buf, "qwerty");
    }

    return buf;
}

int main()
{
    std::string empty_str = alloc_string(false);
    std::cout << "empty_str size is: " << empty_str.size() << std::endl;

    std::string str = alloc_string(true);
    std::cout << "str size is: " << str.size() << std::endl;
    std::cout << "str: " << str << std::endl;
}

安全(对于空终止的缓冲区),但不容易读取,考虑将最后一行更改为

return std::string(buf);

编辑:请参阅关于安全的karlphillip。

实际上问题的标题不正确。您正在以std::string的形式返回字符数组。除非buf确实以null结尾,否则不安全@T33C:对。我添加了这个基本假设!假设事情是不好的编程实践。相反,我们应该确保返回是安全的。问题中的代码不能确保这一点,如果buf后来按照注释所示进行了修改。除非buf确实以null结尾,否则这是不安全的!正如下面@karlphillip所描述的,它是安全的,因为语句char buf[128]=“”;是将buf设置为指向以null结尾的空字符串的初始化,它不会在数组中设置单个字符。如果忘记初始化数组,则肯定会中断代码,因为该内存块上可能存在垃圾。尝试一下,您可能会注意到
empty\u str
不再是空的,即使您没有向它复制任何内容。
return std::string(buf);