传递字符串问题

passing string around question

本文关键字:问题 字符串      更新时间:2023-10-16

>我有一个成员函数,比如

setResult(const std::string &s)
{
         this->m_result = s;
}

经过检查,我发现this->m_result的地址与s相同。如果堆栈对象是堆栈对象,当s超出范围时s m_result会消失(或成为垃圾)吗?

可能不是;如果m_result是 std::string,它将深度复制数据内容。

无论如何,在像分配运算符这样的地方,您通常会检查这种自我分配。 成语是:

obj& operator=(const obj& o) {
    if ( this != &o ) // ...
}

您的情况也是如此,您可能会检查它&m_result与传入的字符串不同。 但是 std::string 通常是为了实现自复制是可以的。

实际上s不是堆栈对象,因为它是一个引用(引用本身是一个堆栈对象,但字符串不是)。实际上,如果您将this->m_result传递给testResult,实际上this->m_result只能与s具有相同的地址,但是尽管自我分配毫无用处,但在这种情况下它不会造成任何伤害。

编辑:另一种情况可能是,this->m_result不是std::string,而是对它的引用。然后你遇到了一个问题,因为你得到了对一个被破坏对象的引用。请记住,引用只不过是一个指针(只是使用起来更舒适并且功能减少)。