Win32 中的指针所有权 API

Pointer Ownership in the Win32 API

我正在尝试了解 Win32 API 如何处理指针所有权。

我现在正在查看的具体示例是指向我传递给 API 并从 API 获得的字符串的指针的所有权。

SetWindowText函数为例。它需要一个 LPCSTR,一个指向空终止宽字符串的指针。

另一个例子是 RegisterClass 函数和 WNDCLASS 结构。 RegisterClass 函数采用指向 WNDCLASS 结构的指针,并且 WNDCLASS 结构再次包含指向 class 名称的 LPCSTR

API 是否拥有该内存,或者我是否需要处理释放它?

我认为它不太可能获得所有权,但我对 C/C++ 约定的了解还不足以肯定地说,而且我找不到任何关于 [= 的所有权约定的文档32=].

Does the API take ownership of that memory or do i need to handle freeing it?

Win32 API 中没有这种自动内存管理。如果您在您的程序中分配一些数据并将这些数据提供给 Win32 API 函数,您将不得不在您的程序中 free 它。

C中的

API通常是这样设计的,因为其他层没有办法确定指针是否在程序的其他地方使用。如果手动内存管理对您来说很烦人,您可以搜索 garbage collectors,它会自动为您管理内存,但会在性能方面做出一些小的折衷。

一般答案是:阅读相关函数的文档。如果它没有说任何关于取得所有权的事情,那么它不取得所有权是一个很好的选择,你需要处理内存。

虽然我已经有一段时间没有在 Windows API 级别做很多重要的工作了,但我记得偶尔会遇到一些函数,这些函数记录了它们需要通过特定方法分配内存首先 - 因为这是知道如何正确释放它的唯一方法。

这就引出了第二种推理方式。假设您是该功能的实现者。如果你只是得到一个没有其他信息的原始指针,你能知道如何释放它指向的内存吗?那块内存是用 new 分配的吗? malloc?其他 API 电话?或者它在堆栈上? C / C++ / Windows API 的级别没有任何工具可以仅通过指针来确定内存的分配方式。因此,如果不需要,大多数功能都不会处理这些麻烦。少数有充分理由的人将不得不遵循记录他们的要求的路线。