在此代码中:
QString dataStr;
myfunc(dataStr.toUtf8().constData());
toUtf8() 创建的临时 QByteArray 对象是在进入 myfunc() 范围之前销毁还是保证在 myfunc() 调用完成后销毁?
我正在使用与此类似的代码:
class Request
{
public :
std::function<void()> requestFunc;
};
void myfunc(const char* data)
{
auto request = new Request();
auto lambda = [](const std::string& str)
{
cout << str;
}
// Use data
request->requestFunc = std::bind(std::move(lambda), std::string(data));
requestQueue.push(std::move(request));
}
QString dataStr;
myfunc(dataStr.toUtf8().constData());
// Some time later, requestQueue gets managed and requestFunc gets called
我一位同事的一台机器崩溃了。我们解决了这个问题,显式更改了 toUtf8() 创建的临时 QByteArray 对象的范围:
...
QString dataStr;
const QByteArray tempObj = dataStr.toUtf8();
myfunc(tempObj.constData());
它解决了崩溃问题。但后来我们与另一位同事讨论,我不清楚 C++ 标准/编译器是否应该保留临时对象直到函数调用完成,或者它的范围是否仅限于参数,因此一旦进入 myfunc() 临时参数对象就已经被销毁了。
我看到的两种可能性解释了崩溃的“修复”:
如果是后一种情况,那么您知道错误可能出在哪里吗?
toUtf8() 创建的临时 QByteArray 对象是在进入 myfunc() 范围之前销毁还是保证在 myfunc() 调用完成后销毁?
该对象不是参数对象。它是一个临时对象。临时对象在创建它的完整表达式结束时被销毁,尽管存在一些例外情况,但都与本示例无关。请注意,参数对象,即对应于函数的非引用参数的对象,不是临时对象,并且遵循其他规则。
示例中完整表达式的结尾是在计算
myfunc(dataStr.toUtf8().constData())
之后,即在表达式语句的末尾。