我怎么不能删除pwstr?

时间:2013-12-02 16:03:53

标签: c++ winapi

拜托,有人可以解释一下为什么这段代码会在运行时给出错误“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;
}

2 个答案:

答案 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也不会使用它。