C++ 如果在std::wstring声明和std::setlocale()之后调用,则mbrlen()将无法返回

C++ 如果在std::wstring声明和std::setlocale()之后调用,则mbrlen()将无法返回,c++,C++,如果在std::wstring声明和std::setlocale()之后调用,则mbrlen()将无法返回 例如: #include <locale> #include <wchar.h> int main() { std::wstring TestString; std::setlocale(LC_ALL, ""); mbstate_t mbs; size_t Res = mbrlen(NULL, 0, &mbs); //

如果在std::wstring声明和std::setlocale()之后调用,则mbrlen()将无法返回

例如:

#include <locale>
#include <wchar.h>

int main() {
    std::wstring TestString;
    std::setlocale(LC_ALL, "");
    mbstate_t mbs;
    size_t Res = mbrlen(NULL, 0, &mbs);    //Initialize mbs
    return 0;
}
不返回,但删除std::wstring声明可以解决问题,因此返回的结果很好:

#include <locale>
#include <wchar.h>

int main() {
    //std::wstring TestString;
    std::setlocale(LC_ALL, "");
    mbstate_t mbs;
    size_t Res = mbrlen(NULL, 0, &mbs);    //Initialize mbs
    return 0;
}
#包括
#包括
int main(){
//std::wstring测试字符串;
std::setlocale(LC_ALL,“”);
mbstate_t mbs;
size_t Res=mbrlen(NULL,0,&mbs);//初始化mbs
返回0;
}
或者删除
setlocale()
(同时保留声明)也可以


fedora 20,g++4.8.3 20140624

您应该在尝试使用它之前将其归零

#include <cstring>
memset(&mbs, 0, sizeof(mbs));

在尝试使用mbs之前,应将其归零

#include <cstring>
memset(&mbs, 0, sizeof(mbs));

在尝试使用mbs之前,应将其归零

#include <cstring>
memset(&mbs, 0, sizeof(mbs));

在尝试使用mbs之前,应将其归零

#include <cstring>
memset(&mbs, 0, sizeof(mbs));

足够公平-有缺陷的grrr示例:足够公平-有缺陷的grrr示例:足够公平-有缺陷的grrr示例:足够公平-有缺陷的grrr示例: