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
定义的,因此您需要相应地选择字符串类型。
我通常是一名 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
定义的,因此您需要相应地选择字符串类型。