Win32 API 中的指针所有权

Eri*_*lze 0 c c++ windows winapi pointers

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

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

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

另一个例子是RegisterClass函数和WNDCLASS结构体的结合。该RegisterClass函数接受一个指向WNDCLASS结构的指针,该WNDCLASS结构再次包含LPCSTR指向类名的 a。

API 是否拥有该内存的所有权,还是我需要处理释放它?

我似乎不太可能拥有所有权,但我对 C/C++ 约定的了解不足以肯定地说,而且我找不到任何关于 API 所有权约定的文档。

The*_*ish 5

一般的答案是:阅读相关函数的文档。如果它没有说明任何有关获得所有权的信息,那么可以肯定的是它没有获得所有权并且您需要处理内存。

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

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