将宏作为 CString 引用传递

Posted

技术标签:

【中文标题】将宏作为 CString 引用传递【英文标题】:Passing macro as a CString reference 【发布时间】:2019-05-13 17:59:35 【问题描述】:

我正在分析我的应用程序崩溃,我怀疑我当前的方法(下面粘贴的代码中的方法 1)可能会导致崩溃,但不确定。 我已粘贴在我的代码下方以供参考。崩溃无法在内部重现,也没有转储。

#define SAMPLE_STRING L"Hello world"

class CFoo

    std::map <CString, CString> m_map;
public:
    void SetMyString(__in const CString&  csParam)
    
        CString csKey(L"Mykey");
        m_map[csKey] = csParam;
    
;
int main()

    //approach 1
    CFoo obj;
    obj.SetMyString(SAMPLE_STRING);


    //approach 2
    CFoo obj;
    CString csMystr(SAMPLE_STRING);
    obj.SetMyString(csMystr);


以下是我的问题:

    我们可以,还是应该使用宏创建 CString 初始化,然后传递 CString 的引用? 以上两种方法有什么区别? 使用方法 1 会导致应用程序崩溃吗?如果可以,有人可以解释一下吗?

【问题讨论】:

这段代码是用方法1编译的吗? Crash is not reproducible in-house and no dumps either. 那么你怎么知道这是问题的根源呢?如果您无法重现它,您需要故障转储/日志或至少应用程序日志来了解问题所在。您的代码示例看起来有效。 你的宏大小写和obj.SetMyString(CString(L"Hello world"))一模一样。这完全没有问题,也不是问题的根源。 两种方法没有区别。情况 1 的转换是在情况 2 中显式地静默完成的。 附带说明,这里不需要宏。我建议写constexpr wchar_t SAMPLE_STRING[] = L"Hello World";。如果你的编译器没有constexpr,写const wchar_t* const SAMPLE_STRING = L"Hello World"; 【参考方案1】:

正如大家所说,问题的根源在不同的地方。感谢大家的快速响应。问题已重现,它帮助修复了崩溃。问题的根源是,正在将包含英文和日文字符的文件读取到 CStringA 变量中,同时尝试执行 makelower 它崩溃了。从字面上看,日文字符在 CStringA 中被转换为垃圾。 CString makelower 是问题的根源。

【讨论】:

以上是关于将宏作为 CString 引用传递的主要内容,如果未能解决你的问题,请参考以下文章

是否有简单的 PHP 代码来区分“将对象作为引用传递”与“将对象引用作为值传递”?

ShellExecute传递参数外引程序

c# 值传递 引用传递

值传递和引用传递的区别

将向量的引用作为参数传递

仅将 ArrayList 作为值而不是引用传递