【问题标题】:How do I use _malloca instead of _alloca in Win32 C++ project?如何在 Win32 C++ 项目中使用 _malloca 而不是 _alloca?
【发布时间】:2021-08-27 01:23:14
【问题描述】:

我正在更新一个旧的 C++ DLL 项目。对于导出的函数之一,有

BSTR __stdcall j2cs( const long lJulian, int bDMY, BSTR sDelim ) {
    USES_CONVERSION;
    int iDay, iMonth;
    long lYear;
    char chDate[20];
    char chInt[10];
    char * cDelim = W2A( sDelim );

W2A 宏定义为

#define W2A(lpw) (\
    ((_lpw = lpw) == NULL) ? NULL : (\
        (_convert = (static_cast<int>(wcslen(_lpw))+1), \
        (_convert>INT_MAX/2) ? NULL : \
        ATLW2AHELPER((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), _acp))))

Visual Studio 2019 使用以下编译器警告标记 W2A 宏

Warning C6255   _alloca indicates failure by raising a stack overflow exception.  Consider using _malloca instead.  

如何对 W2A 宏进行建议的更改?还是我应该忽略警告?

稍后

我的USES_CONVERSION 宏定义为

#define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)

【问题讨论】:

    标签: c++ malloc bstr alloca


    【解决方案1】:

    W2A 不能更改为使用malloc。您必须在所有使用W2A 的地方添加free。理想的替代方案是 std::vector 代替 _alloca

    更新宏USES_CONVERSION,使其包含std::vector&lt;WCHAR&gt; _buffer;并更新宏W2A

    #define USES_CONVERSION int _convert = 0; (_convert); std::vector<WCHAR> _buffer; (_buffer); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
    
    #define W2A(lpw) (\
        ((_lpw = lpw) == NULL) ? NULL : (\
            (_convert = (static_cast<int>(wcslen(_lpw))+1), \
            (_convert>INT_MAX/2) ? NULL : \
            (_buffer.resize(_convert), \
            ATLW2AHELPER((LPSTR) _buffer.data(), _lpw, _convert*sizeof(WCHAR), _acp)))))
    

    【讨论】:

    • 我添加了更多细节。我没有在 USES_CONVERSION 的定义中看到应该使用std::vector 表示法。
    • 更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多