C++ 和 Win32:我什么时候必须释放变量等?

C++ and Win32: When do I have to release variables etc?

我通常是一名 Java 程序员,我的 C++ 时代已经过去至少 15 年了。现在我使用 C++ 为某些 Win32 函数构建一个桥接器 (dll)。

问题仍然存在,我什么时候必须释放从 Win32 调用中选择的字符串等?

例如:User32.dll => WINUSERAPI UINT WINAPI RealGetWindowClassA(__in HWND hwnd, __out_ecount_part(cchClassNameMax, return) LPSTR ptszClassName, __in UINT cchClassNameMax);。它给了我一个指向 class 名称的指针,我只是使用 JNA 将它映射到 char []。复制后必须销毁吗?

是否有释放/释放/处置(?)/删除/释放的提示?

[更新]

正如 technomage 已经指出的那样,这个例子是关于拥有正在移交的缓冲区。但普遍的问题是我什么时候必须处理它,什么时候不需要?有没有我可以遵循的语法或提示?

再举一个例子,获取接口 (ISomething) 并获取其属性之一。通常一个人交出一个双指针(ppVariable),这样它就可以写一个指针值作为操作的结果。有一次,我看到了 SysFreeString 跟进的跟进电话。所以我想我必须在使用它之后释放它。

对这个有什么想法吗?如何处理?

此外,我从未见过 window 句柄被处置(至少在我的代码中没有)。规则是什么?

您正在将缓冲区传递给本机函数并告知缓冲区的大小。这允许被调用的函数将数据复制到您的缓冲区,而不必担心分配内存。

您已经拥有缓冲区,因此适用正常的 Java 规则。

顺便说一句,如果您需要将 byte[]-A 函数一起使用,并将 char[]-W 函数一起使用。 "out" 参数是用 LPTSTR 定义的,因此您需要相应地选择字符串类型。