Return 没有内存泄漏

Return without memory leak

我尝试编写一个将 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
}

经典。使用 C++ 的力量! ...析构函数释放分配的内存

而不是你的

wchar_t buffer [1024];

为什么不声明和使用 Wstr class,看起来大致像这样(也许 malloc 和 free to used 而不是 new 和 delete ?):

class Wstr {
public :
  Wstr () : val_ ((wchar_t*) NULL), size_ (0) {}
  ~Wstr () {
    if (val_ != (wchar_t*)NULL) {
      delete[] val_;
      val_ = (wchar_t*)NULL;
    }
  }
  Wstr& operator = (const char*& str) {
    size_ = strlen(str) + 1;
    if (val_ != (wchar_t*) NULL) {
      delete [] val_;
      val_ = (wchar_t*) NULL;
    }
    size_t newStrSize = strlen(str) + 1;
    size_t convertedChars = 0;
    mbstowcs_s(&convertedChars, val_, newStrSize, str, _TRUNCATE);
    size_ = newStrSize;
    return *this;
  }
  //.. copy cons, op =, op ==, op != to be written
  wchar_t* val_;
  size_t size_;
};