C++ 我如何不能删除pwstr?
请,有人能解释一下为什么这段代码在运行时“expression\u block\u type\u is\u valid(phead-nblockuse)”中给了我错误吗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分配的。事实上,如果你看到: 调用进程负责在调用不再需要此资源
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间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>和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;
}