你如何最好地利用wcsdup?

时间:2015-08-28 12:52:59

标签: c++ arrays memory strdup wcsdup

我正在编写代码,其中很大一部分需要返回wchar数组。返回wstrings并不是一个真正的选项(尽管我可以使用它们)并且我知道我可以将指针作为参数传递并填充它,但我特别想要返回指向这个宽字符数组的指针。前几次迭代,我发现我会将数组恢复正常,但是当它们被处理和打印时,内存将被覆盖,我将留下乱码。为了解决这个问题,我开始使用wcsdup来修复所有内容,但是我正在努力准确地掌握发生了什么,因此,应该调用它以便它可以工作而且我没有泄漏任何内存。实际上,每次我返回一个字符串时都会使用wcsdup,并且每次返回一个字符串时,我知道这会泄漏内存。这就是我正在做的事情。我应该在哪里以及为什么要使用wcsdup,还是有比wcsdup更好的解决方案?

wchar_t *intToWChar(int toConvert, int base)
{
    wchar_t converted[12];
    /* Conversion happens... */
    return converted;
}

wchar_t *intToHexWChar(int toConvert)
{
    /* Largest int is 8 hex digits, plus "0x", plus /0 is 11 characters. */
    wchar_t converted[11];

    /* Prefix with "0x" for hex string. */
    converted[0] = L'0';
    converted[1] = L'x';

    /* Populate the rest of converted with the number in hex. */
    wchar_t *hexString = intToWChar(toConvert, 16);
    wcscpy((converted + 2), hexString);

    return converted;
}

int main()
{
    wchar_t *hexConversion = intToHexWChar(12345);
    /* Other code. */

    /* Without wcsdup calls, this spits out gibberish. */
    wcout << "12345 in Hex is " << hexConversion << endl;
}

2 个答案:

答案 0 :(得分:0)

由于您使用“C ++”标记了您的问题,答案是响亮的:不,您根本不应该使用wcsdup。相反,要传递wchar_t值的数组,请使用std::vector<wchar_t>

如果需要,您可以通过获取第一个元素的地址(因为向量保证存储在连续的内存中)将它们转换为wchar_t*,例如。

cout << "12345 in Hex is " << &hexConversion[0] << endl;

答案 1 :(得分:0)

wchar_t *intToWChar(int toConvert, int base)
{
    wchar_t converted[12];
    /* Conversion happens... */
    return converted;
}

返回指向局部变量的指针。

wchar_t *hexString = intToWChar(toConvert, 16);

在此行之后,hexString将指向无效的内存,并且使用它是未定义的(可能仍然有值或可能是垃圾!)。

您从intToHexWChar返回时也会做同样的事情。

解决方案:

  • 使用std::wstring
  • 使用std::vector<wchar_t>
  • 将数组传递给函数以供其使用
  • 使用智能指针
  • 使用动态内存分配(请不要!)

注意:您可能还需要更改为wcout而不是cout