【问题标题】:does it lead to memory leak?它会导致内存泄漏吗?
【发布时间】:2011-06-16 17:56:29
【问题描述】:

我写了这段代码:

string getWinTitle(HWND hwnd){
const int MAX_LENGTH = 1000;
wchar_t title[MAX_LENGTH];
ZeroMemory(title, MAX_LENGTH);
GetWindowText(hwnd, (LPWSTR)title, MAX_LENGTH);
char* buffer = new char[MAX_LENGTH];
wcstombs(buffer, title, MAX_LENGTH);
string res = buffer;
return res;
}

这里有内存泄漏吗? 我需要释放 ZeroMemory 分配的内存吗? 我需要显式释放为缓冲区分配的内存吗?

谢谢

【问题讨论】:

    标签: c++ windows memory memory-leaks


    【解决方案1】:

    你需要delete [] buffer;,因为它是new []分配的。

    ZeroMemory 用 0 填充内存块,它不做任何内存分配。

    另外作为一个侧面说明,既然您正在处理 wchar_t 数组,为什么不使用 std::wstring

    编辑演示

    string getWinTitle(HWND hwnd){
        const int MAX_LENGTH = 1000;
        wchar_t title[MAX_LENGTH];
        ZeroMemory(title, MAX_LENGTH);
        GetWindowText(hwnd, (LPWSTR)title, MAX_LENGTH);
        char* buffer = new char[MAX_LENGTH];
        wcstombs(buffer, title, MAX_LENGTH);
        string res = buffer;
    
        delete [] buffer; // You must do this, otherwise this is a memory leak if buffer is never deleted
    
        return res; // res's data is copied from buffer, it is not affected by you doing delete [] buffer
    }
    

    避免内存分配

    由于您没有使用依赖于运行时值的分配大小,因此您可以使用堆栈分配的数组:

    string getWinTitle(HWND hwnd){
        const int MAX_LENGTH = 1000;
        wchar_t title[MAX_LENGTH];
        ZeroMemory(title, MAX_LENGTH);
        GetWindowText(hwnd, (LPWSTR)title, MAX_LENGTH);
        //char* buffer = new char[MAX_LENGTH];
        char buffer[MAX_LENGTH]; // this is on the stack
        wcstombs(buffer, title, MAX_LENGTH);
        string res = buffer;
        return res;
    } // buffer is automatically cleaned up
    

    【讨论】:

    • +1 @Michaels:如果它对您有足够的帮助,请接受这个答案。
    • +1。或者,只需在堆栈中定义 buffer 即可避免完全处理内存管理。
    • 大卫,如何在栈中定义缓冲区?
    • @michaels123 - wchar_t title[MAX_LENGTH]; 在堆栈上创建 title。在堆栈上基本上意味着不使用动态内存分配。对你来说,你可以做char buffer[MAX_LENGTH],因为你没有一个在运行时依赖于某些东西的数组大小。
    • 好的。我明白了... wcstombs 是否分配内存并返回指向它的指针?我想确保我的函数不会返回指向然后被释放的内存的指针……
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-10-28
    相关资源
    最近更新 更多