我遇到了下面的函数:
#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);
}
我的具体问题是关于函数返回的内容。看起来它返回了一个指向"buffer"的指针。哪个在堆栈上,对吧?
这不是个问题吗?
是的,函数strerror_r
使用buffer
存储消息并返回消息,但由于函数getErrnoString
返回std::string
,因此调用了一个隐式转换构造函数:
string::string(const char* data)
此构造函数将数据从传递的指针复制到std::string
本身的内部缓冲区,因此不会出现任何问题,因为您可以返回存储在std::string
中的缓冲区的副本,并按值返回该副本。
上述代码不返回指向本地缓冲区的指针。它根本不返回任何指针。它返回一个由strerror_r
返回的char缓冲区构造的std::string
对象。按值返回std::string
对象是完全安全的。
此函数中的return
语句执行到std::string
类型的隐式转换。在明确的形式中,它看起来如下
return std::string(strerror_r(errorNumber, buffer, maxLength));
请注意,上述代码中使用的strerror_r
的GNU特定版本并不保证该函数将使用用户提供的缓冲区。该函数允许返回指向系统缓冲区的指针,而不使用用户提供的缓冲区。但在一般情况下,用户必须假设用户提供的缓冲区将用于字符串。
返回函数strerror_r(errorNumber, buffer, maxLength);
返回的std::string
您正在将指向"buffer"的指针作为参数传递给函数strerror_r
和其他参数,如maxlength
和errorNumber
。