拜托,有人可以解释一下为什么这段代码会在运行时给出错误“expression _block_type_is_valid(phead-nblockuse)”?
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <shlobj.h>
#include <iostream>
using namespace std;
int main() {
PWSTR path;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &path);
delete[] path;
return 0;
}
答案 0 :(得分:6)
因为new
未分配内存。事实上,如果你read the documentation,你会看到:
调用进程负责在调用
CoTaskMemFree
后不再需要该资源时释放该资源。
答案 1 :(得分:1)
对此有一个更普遍的答案(@Joachim的回答暗示):
在Windows中,memory is allocated by a specific function, and must be freed by its corresponding deallocator.
此外,即使在特定语言(例如,C ++)中,也可以从多个堆分配内存,并且必须在该堆内释放内存。 (特别是C / C ++ DLL,在加载时获取自己的堆,并且该DLL分配的内存必须被该DLL释放。做错了,你的内存损坏和崩溃。)
COM有自己的分配器/解除分配器(CoTaskMemAlloc
/ CoTaskMemFree
),这可能是你最接近系统范围的分配功能;但即便如此,shell API也会使用它,而许多其他分配内存的Win32 API也不会使用它。