【发布时间】:2015-06-23 15:17:30
【问题描述】:
QString createString()
{
return QString("foobar");
}
const QString& getString()
{
return createString();
}
这将在 VS2013 中产生著名的“警告 C4172:返回局部变量或临时地址”。
现在,如果我将第二种方法更改为
const QString& getString()
{
const QString& binder = createString();
return binder;
}
不再报告错误。这是在不更改 API 签名的情况下修复警告的安全方法吗?为什么会这样?
【问题讨论】:
-
为什么不让
createString()简单地从new QString返回指针?然后调用者拥有该字符串,并且可以根据需要保存、删除或引用它。 -
@donjuedo 这是一个可怕的想法。不涉及指针,在这种情况下手动管理内存是完全没有根据的。
-
@pmr,恕我直言,我不同意。创建对象,但既没有变量名也没有指针,在使用新对象时会留下尴尬的情况。
-
如果您需要在指针中返回某些内容,请始终使用 std::unique_ptr 或 std::shared_ptr(或任何其他替代方法,例如来自 Boost)并按值返回该智能指针。但是在问题中的代码中,最好只返回一个值。
-
@donjuedo QString 是一个指针。确切地说,它是指针的包装器。见:code.woboq.org/qt5/qtbase/src/corelib/tools/…