【问题标题】:Return without memory leak返回没有内存泄漏
【发布时间】: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


【解决方案1】:

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

代替你的

wchar_t buffer [1024];

为什么不声明和使用 Wstr 类,看起来大概像这样(可能是 malloc 并且可以免费使用,而不是 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_;
};

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 2021-11-01
    • 1970-01-01
    • 2011-01-26
    • 2013-09-05
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多