我有一个像
这样的成员函数setResult(const std::string &s)
{
this->m_result = s;
}
检查后,我发现this->m_result
的地址与s
相同。如果m_result
是堆栈对象,s
超出范围时s
会消失(或变成垃圾)吗?
答案 0 :(得分:0)
可能不是;如果m_result
是std :: string,它将深层复制数据内容。
无论如何,在分配操作员这样的地方,你通常会检查这种自我分配。成语是:
obj& operator=(const obj& o) {
if ( this != &o ) // ...
}
对于您的情况也是如此,您可以检查它&m_result
与传入的字符串不同。但是通常会实现std :: string,以便自我复制。
答案 1 :(得分:-1)
有效s
不是堆栈对象,因为它是一个引用(引用本身是一个堆栈对象,但字符串不是)。实际上,如果您将this->m_result
传递给this->m_result
,testResult
只能拥有与s相同的地址,但是虽然自我分配毫无用处,但在这种情况下它不会造成任何伤害。
编辑:另一种情况可能是,this->m_result
不是std :: string,而是对它的引用。然后,当您获得对被破坏对象的引用时,您遇到了问题。请记住,引用只不过是一个指针(使用起来更舒适,功能更少)。