较为郁闷

今天反复出现这个错误:
text2ArticleXML.exe 中的 0x0062efa7 处最可能的异常: 0xC0000005: 读取位置 0xfeeefef2 时发生访问冲突
text2ArticleXML.exe 中的 0x0062efa7 处未处理的异常: 0xC0000005: 读取位置 0xfeeefef2 时发生访问冲突
发生问题的,是boost的这段代码

template<class OStream>
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
basic_text_oprimitive<OStream>::basic_text_oprimitive(
    OStream & os_,
    bool no_codecvt
) : 
    os(os_),
    flags_saver(os_),
    precision_saver(os_),
    archive_locale(NULL),
    locale_saver(os_)
{
    if(! no_codecvt){
        archive_locale.reset(
            add_facet(
                std::locale::classic(), 
                new codecvt_null<BOOST_DEDUCED_TYPENAME OStream::char_type>
            )
        );
        os.imbue(* archive_locale);
    }
    os << std::noboolalpha;
}

我能猜测到的,唯一的缘由是,ACE,boost,wxWidget 这三个库不能很好的合作在一起。
其次,vc8的locale实在是古怪。
我的习惯是在程序的一开始加入

setlocale(LC_ALL,"");
std::locale::global(std::locale(""));

但是它经常会导致一些古怪的结果。
例如,如果我这么做了。那么,
std::wcout就不能输出中文,除非我将这两句话中的某一句注释掉(对wcout调用std::wcout.imbue(std::locale (""));也不行)。
换句话说,只要调用过setlocale,那么std::wcout就不能输出中文了。
可是如果不调用setlocale的话,atoi等这样的函数就会很有问题。简单点来说,它会经常性的直接抛异常而结束。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥