Ответ 1
Да. Это прекрасно. Вызывающий получит копию локального буфера, потому что std::string
сделает глубокую копию этого локального буфера!
EDIT: я предполагаю, что строка buf
имеет нулевую завершенность!
Является ли следующее безопасным как есть, без явного перевода или вызова конструктора std::string? Если не безопасно, почему бы и нет?
std:string myfunc()
{
char buf[128] = "";
// put something into buf or not base on logic.
return buf;
}
Да. Это прекрасно. Вызывающий получит копию локального буфера, потому что std::string
сделает глубокую копию этого локального буфера!
EDIT: я предполагаю, что строка buf
имеет нулевую завершенность!
Да, это хорошо, помните, на С++, что произойдет, будет создан неявный конструктор для создания возвращаемого объекта, а строка может быть построена с помощью массива символов. В С++ вы должны явно возвращаться по ссылке, если вы не хотите, чтобы созданная копия.
Собственно, это безопасно. Но это только потому, что вы инициализируете 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
safe (для буфера с нулевым завершением), но не легко читать, подумайте об изменении последней строки на
return std::string(buf);
Изменить: см. карлфиллип по безопасности.