C++ 我如何不能删除pwstr?

C++ 我如何不能删除pwstr?,c++,winapi,C++,Winapi,请,有人能解释一下为什么这段代码在运行时“expression\u block\u type\u is\u valid(phead-nblockuse)”中给了我错误吗 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; int main(){ PWSTR通路; HRESULT hr=SHGetKnownFolderPath(文件夹ID_桌面,0,空,&path); 删除[]路径; 返回0; } 因为内存不是由new分配的。事实上,如果你看到: 调用进程负责在调用不再需要此资源

请,有人能解释一下为什么这段代码在运行时“expression\u block\u type\u is\u valid(phead-nblockuse)”中给了我错误吗

#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
PWSTR通路;
HRESULT hr=SHGetKnownFolderPath(文件夹ID_桌面,0,空,&path);
删除[]路径;
返回0;
}

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

调用进程负责在调用不再需要此资源时释放此资源


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

在窗户里

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


COM有自己的分配器/释放定位器(
CoTaskMemAlloc
/
CoTaskMemFree
),这可能是最接近系统范围的分配功能;但即使是shell API也大多使用这种方法,而许多其他分配内存的Win32 API也不使用这种方法。

…因为您没有新建它。准确地说,是因为您没有
new[]
it。C++是不宽容的。您必须将每个分配与正确的释放函数相匹配。您必须对从
SHGetKnownFolderPath
返回的指针使用
CoTaskMemFree
,因为它在内部使用
CoTaskMemAlloc
<代码>新< /COD>和删除> /Cord>在C++中使用完全不同的内存system@user3058108Windows有许多不同的分配/释放系统,具体取决于内存的用途。您通常应该在程序中使用
new
/
delete
,但对于某些Windows API函数,您需要使用其他分配函数。@用户Windows不知道您要使用哪个分配器。Windows是运行时不可知论者。您可能不使用C++。许多其他语言都能够调用该API函数。因此Windows使用它自己的分配器(COM堆),导出该分配器,并告诉您使用它来释放内存。你并不笨,你只是还没有学会这些东西而已。但是你真的应该养成阅读文档的习惯。我认为(但没有检查)你可以使用智能指针来实现这一点:
std::unique_ptr path_ptr(path,&CoTaskMemAlloc)。这就告诉C++,内存必须最终被< Cord> COTASKMeMeloCalc>代码>删除,但它会让您无法准确地确定何时需要发生。@ MsAlter将是<代码> COTASKMEMFEXE//COD>。但通常最好将其复制到字符串对象,并立即释放原始内存。@IInspectable:为什么会有问题
LPVOID
只是一种写
void*
的冗长方式,任何指针都会转换为
void*
。它是从
void*
转换而来,需要强制转换。
#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;
}