我应该释放我复制到剪贴板的内存吗?

3

当我在我的win32程序中将数据复制到剪贴板时,我是否应该在将其粘贴到其他地方后释放我复制到剪贴板的内存?还是系统会负责这个呢?

4个回答

7

有两种方法可以将数据放入剪贴板。

方法1:通过调用SetClipboardData并将非 NULL 值作为第二个参数传递,直接将数据放到剪贴板上。在这种情况下,系统将负责数据的处理,您不应自行释放它。

方法2:通过调用SetClipboardData并将NULL作为第二个参数传递,将一个占位符放入剪贴板中。在这种情况下,应用程序要负责处理数据,直到它使用非NULL的第二个参数调用SetClibpoardData,此时责任转移到操作系统。

从您的问题中无法确定您使用的是哪种方法。


3

阅读文档

如果SetClipboardData成功,系统将拥有由hMem参数标识的对象。 应用程序一旦所有权已转移给系统,就不能再写入或释放数据。

跟踪剪贴板数据以便在关闭应用程序时从剪贴板中删除它是完全可选的。 一旦数据位于剪贴板上,系统就拥有了它,并且与您的应用程序分开,因此您可以选择将其留在剪贴板上,以便在关闭应用程序后继续使用。 除非您正在使用延迟呈现(delayed rendering),在这种情况下,在关闭应用程序时将其从剪贴板中删除是有意义的,因为您的应用程序将不再运行以呈现其他应用程序请求的数据。


1
你的应用程序负责处理剪贴板上的数据,如果它将其放在那里。这就是为什么很多应用程序(如Microsoft Office)在退出应用程序时会询问您是否要保留大量数据在剪贴板上或不保留的原因。
然而,我强烈建议进行用户交互,因为您不知道用户是否稍后需要在其他地方使用剪贴板上的数据。

1
这取决于数据是如何放置的。如果通过 SetClibpoardData 和非 NULL 数据参数放置,则操作系统负责数据,而不是应用程序。 "如果 SetClipboardData 成功,则系统拥有由 hMem 参数标识的对象。一旦所有权已转移给系统,应用程序将无法写入或释放数据。" - Raymond Chen
谢谢 Raymond,我之前不知道这件事。顺便说一下,我是你博客的忠实粉丝 ;) - John Willemse

0

通常由系统完成,但一些负责任的应用程序也会在离开前要求用户释放剪贴板。

例如,MSWord将在退出前询问用户是否保留内存中的数据。对于一般用途,您可以将其留给系统处理。

请记住,用户可能希望将其保留在剪贴板中(即使在关闭应用程序后),因此您不应该干扰它并将其从内存中删除。


你可以让系统自行处理,除非是在关机或重启时。应用程序对放置在剪贴板上的数据负有责任,而不是系统。 - John Willemse
@ John Willemse:是的,这是真的,但是即使你不应该对它做任何事情,因为它归用户所有,而且决定是否将其保留在内存中的也是用户。 - Murtuza Kabul
@John Willemse:除了 Microsoft Office 之外,列出一个能够清理剪贴板或要求用户清理剪贴板的应用程序。很难找到几个,这是有原因的。 - Murtuza Kabul
你没有理解我的意思。我同意你通常应该按照我的回答将其留在剪贴板上。但是,如果你的应用程序将大量数据放在剪贴板上,建议询问用户是否想要保留它。即使它可能影响性能,系统也不会自动清除它。 - John Willemse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接