CString作为返回值

4

我为XML Lite库编写了一个小包装器,以便在我的MFC项目中使用它。我能使用这段代码吗?

CString GetValue()
{
    const WCHAR* pwszValue = NULL;
    UINT cwchValue = 0;

    m_pReader->GetValue(&pwszValue, &cwchValue);

    return CString(pwszValue);
}

我应该在GetValue方法签名中使用CString&参数吗?

1
你测试过这个吗?实际上,答案是肯定的,但你的疑虑来自哪里呢? - Mr Lister
m_pReader是什么?你遇到了什么错误? - Mihai Todor
当它返回时,它会在方法结束时调用CString的析构函数吗? - Sameera Kumarasingha
3个回答

3

不需要通过参数返回,这应该可以工作。

如果你担心效率问题,不用担心。在这种情况下,很可能会发生返回值优化。


额,我们在谈论的是MSVC。不要假设任何关于优化的事情。相反,进行测试。 - Mr Lister
2
@MrLister:是的,这是MSVC,不需要假设,已经测试过了,它执行RVO。 - Benjamin Lindley

1

如果您正在考虑效率,那么打开优化并进行测量。并且考虑是否对您有任何影响。几乎可以确定编译器将在此处执行返回值优化(RVO)。

但是作为一般规则,使用给您更多清晰代码的编码实践,即在这种情况下给出函数结果,从而提供更简洁、强大和易读的调用代码。

话虽如此,看起来您正在泄漏内存,并且匈牙利符号前缀不太容易阅读并降低了清晰度,因此即使您做出明智的决定并使用函数结果值,代码仍需要重新编写。


似乎您的pwszValue存在内存泄漏,为什么会这样? - Luchian Grigore
@Luchian:理论上讲,m_pReader->GetValue 存储在 pwszValue 中的静态分配字符串的地址是可能的,但这种情况有多大可能性呢? - Cheers and hth. - Alf
不幸的是,GetValue(WCHAR **,UINT *) 很可能不会给你一个值,而是设置参数指向一个字符串,该字符串几乎立即被更改。 - Bo Persson

0
"

CString&会死得很惨,它返回的是一个临时引用,你的程序很快就会崩溃。

"

OP指的是将CString&作为函数参数。那样可以正常工作。 - Mr Lister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接