我遇到过以下功能:
#include <string.h>
using namespace std;
std::string getErrnoString(const int errorNumber)
{
const int maxLength = 256;
char buffer[maxLength];
return strerror_r(errorNumber, buffer, maxLength);
}
我的具体问题是关于函数返回的内容。 看起来它返回一个指向&#39;缓冲区&#39; 。哪个在堆栈上 - 对吧?
这不是问题吗?
答案 0 :(得分:4)
是的,函数strerror_r
使用buffer
来存储消息并将其返回,但由于函数getErrnoString
返回std::string
,因此implicit conversion constructor是称为:
string::string(const char* data)
此构造函数将数据从传递的指针复制到std::string
本身的内部缓冲区,因此您没有问题,因为您随后返回存储在std::string
中的缓冲区的副本值。
答案 1 :(得分:2)
上面的代码不会返回指向本地缓冲区的指针。它根本不会返回任何指针。它返回一个由std::string
返回的char缓冲区构造的strerror_r
对象。按值返回std::string
个对象是完全安全的。
此函数中的return
语句执行到std::string
类型的隐式转换。以明确的形式,它将如下所示
return std::string(strerror_r(errorNumber, buffer, maxLength));
P.S。请注意,上述代码中使用的strerror_r
的GNU特定版本不保证该函数将使用用户提供的缓冲区。允许该函数返回指向系统缓冲区的指针,而不使用用户提供的缓冲区。但在一般情况下,用户必须假设用户提供的缓冲区将用于字符串。
答案 2 :(得分:0)
返回从函数std::string
strerror_r(errorNumber, buffer, maxLength);
您正在将指针传递给&#39;缓冲区&#39;作为strerror_r
与maxlength
和errorNumber
等其他参数一起运作的参数。