【发布时间】:2021-09-16 06:34:58
【问题描述】:
我尝试编写一个将char* 转换为wchar_t* 的函数,以简化程序中的多个步骤。
wchar_t* ConvertToWString(char* str)
{
size_t newStrSize = strlen(str) + 1;
wchar_t* newWStr = new wchar_t[newStrSize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, newWStr , newStrSize, str, _TRUNCATE);
return newWStr; // I know i need to call "delete[] newWStr;" but then I can't return the converted string...
}
该函数有效,但它显然内存泄漏。有人知道如何将char* 转换为wchar_t* 的另一种方法吗?
我的问题是函数需要处理不同的字符串长度。
现在我正在使用固定缓冲区的解决方法,但这不是唯一的解决方案:
wchar_t* ConvertToWStringUgly(char* str)
{
wchar_t buffer[1024]; // fixed array for 1023 wchars
size_t newStrSize = strlen(str) + 1;
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, buffer, newStrSize, str, _TRUNCATE);
return buffer; // This is working but not really a good way
}
【问题讨论】:
-
返回
std::wstring? -
好吧,有人必须分配内存。如果它不是函数,那么它必须是调用者。但是您可以通过使用管理内存的 数据类型 来解决此问题,例如
std:;wstring(就此而言,将std::string放在首位用于 char 大小的数据)。顺便说一句:返回指向这样的本地缓冲区的指针是未定义的行为 -wchar_t buffer[1024]是堆栈分配的,因此不存在 在return之后。您需要将其设为static,或使用全局变量。 -
我认为此时您最好通过查找有关 C++ 内存管理的教程而不是尝试提出这样的具体问题。
-
感谢您的回复。返回缓冲区没有问题,因为它总是直接复制到一个新变量中。它旨在成为另一个函数中的堆栈变量。 std::wstring 可以是解决方案。
-
“返回缓冲区没问题”。实际上,您的“固定”版本导致 UB 返回悬空指针,而有问题的函数很好,但 C 风格(可能由任何智能指针或适当的容器修复)。
标签: c++ memory-leaks