【发布时间】: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 初始化,然后传递 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";
标签: c++ visual-c++ atl c-strings msdn