Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 它会导致内存泄漏吗?_C++_Windows_Memory_Memory Leaks - Fatal编程技术网

C++ 它会导致内存泄漏吗?

C++ 它会导致内存泄漏吗?,c++,windows,memory,memory-leaks,C++,Windows,Memory,Memory Leaks,我写了这段代码: 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); s

我写了这段代码:

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分配的内存吗? 我是否需要显式释放为缓冲区分配的内存


谢谢

您需要
删除[]缓冲区因为它是
新[]
分配的

用0填充内存块,它不进行任何内存分配

另外,作为旁注,既然您正在处理
wchar\u 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:如果这个答案对你有足够的帮助,请接受它。或者,只需在堆栈中定义
buffer
,而不必完全处理内存管理。David,如何在堆栈中定义buffer?@michaels123-
wchar\t title[MAX\u LENGTH]在堆栈上创建
标题
。在堆栈上,基本上意味着不使用动态内存分配。对于您来说,您可以执行
char buffer[MAX_LENGTH]
,因为您没有依赖于运行时某些内容的数组大小。Ok。我懂了。。。wcstombs是否分配内存并返回指向它的指针?我想确保我的函数不会返回指向随后被释放的内存的指针…。