【问题标题】:C++ wstringstream << NULLC++ wstringstream << NULL
【发布时间】:2012-06-08 01:06:05
【问题描述】:

我遇到了 wstringstream 的问题。当我这样做时

    std::wstringstream ss;
    wchar_t* str = NULL;
    ss << str;

应用程序因错误而崩溃

Unhandled exception at 0x53e347af (msvcr100d.dll) in stringstr.exe: 0xC0000005: Access violation reading location 0x00000000.

例如这很好用:

ss << NULL;
wchar_t* str = L"smth";
ss << &str;

str 并不总是有价值,有时它可能是 NULL,当它是 NULL 时,我想将 0 放入流中。如何解决?

【问题讨论】:

    标签: c++ stream null wchar-t wstring


    【解决方案1】:

    如果为空,则不输出空wchar_t指针:

    ( str ? ss << str : ss << 0 );
    

    请注意,这不起作用:

    ss << ( str ? str : 0 )
    

    由于隐式条件运算符的返回类型是其两个表达式的通用类型,所以它仍然会返回一个空的wchar_t 指针。

    【讨论】:

    • ahhhhh,我正在尝试ss&lt;&lt;(!str ? 0 : str);,但它不起作用
    • @user1112008:隐式条件运算符返回类型是其两个表达式的通用类型,因此在您的情况下,它仍将返回 null wchar_t 指针。
    • 还有一个问题,如果我们使用模板呢? template &lt;typename type&gt; std::string realToString(type real) 和我们检查real 是否不为NULL?
    • @user1112008:假设type 是一个指针,仍然是同样的检查。
    • @user1112008:问题是const std::wstring 不是指针。使用常规函数重载可以为指针提供与非指针不同的实现:template&lt;typename type&gt; std::string realToString(type real) 用于常规情况,template&lt;typename type&gt; std::string realToString(type* real) 用于指针。
    【解决方案2】:

    在输出到字符串流之前检查(如前所述)

    if (str == NULL) {
        ss << 0;
    } else {
        ss << str;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多