如何无法删除pwstr
How I cannot delete pwstr?
有人能解释一下为什么这段代码在运行时给我错误"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也不使用它。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 如何无法删除pwstr