Возврат массива char как std: string

Является ли следующее безопасным как есть, без явного перевода или вызова конструктора std::string? Если не безопасно, почему бы и нет?

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

   return buf;
}

Ответ 1

Да. Это прекрасно. Вызывающий получит копию локального буфера, потому что std::string сделает глубокую копию этого локального буфера!

EDIT: я предполагаю, что строка buf имеет нулевую завершенность!

Ответ 2

Да, это хорошо, помните, на С++, что произойдет, будет создан неявный конструктор для создания возвращаемого объекта, а строка может быть построена с помощью массива символов. В С++ вы должны явно возвращаться по ссылке, если вы не хотите, чтобы созданная копия.

Ответ 3

Собственно, это безопасно. Но это только потому, что вы инициализируете char array, который является чрезвычайно важным. Рассмотрим следующий код:

#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;
}

Выходы:

empty_str size is: 0
str size is: 6
str: qwerty

Ответ 4

safe (для буфера с нулевым завершением), но не легко читать, подумайте об изменении последней строки на

return std::string(buf);

Изменить: см. карлфиллип по безопасности.