如何无法删除pwstr

How I cannot delete pwstr?

本文关键字:pwstr 删除 何无法      更新时间:2023-10-16

有人能解释一下为什么这段代码在运行时给我错误"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;
}

因为内存不是由new分配的。事实上,如果你阅读文档,你会看到:

调用进程负责在不再需要该资源时通过调用CoTaskMemFree来释放该资源。

对此有一个更一般的答案(由@Joachim的答案暗示):

在Windows中,内存由特定的函数分配,并且必须由其相应的解除定位器释放。

此外,即使在特定的语言(比如C++)中,内存也可以从多个堆中分配,并且必须在该堆中释放。(尤其是C/C++DLL,在加载时会获得自己的堆,而该DLL分配的内存必须由该DLL释放。如果做得不对,就会导致内存损坏和崩溃。)

COM有自己的分配器/解除分配器(CoTaskMemAlloc/CoTaskMemFree),这可能是最接近系统范围分配函数的东西;但即使这样,shell API也大多使用它,而许多其他分配内存的Win32 API也不使用它。