如何将智能指针作为void*传递给函数

How to pass a smart pointer to a function as void*?

本文关键字:函数 void 智能 指针      更新时间:2023-10-16

有些函数使用void *作为参数,在这种情况下如何将智能指针传递到其中?

例如,我有

gboolean callback(gpointer arg); // might delete arg when it finish
A *mydata = new A();
gpointer parg = (gpointer)mydata;
g_timeout_add(100, callback, parg);

如果我在这里使用智能指针:

std::shared_ptr<A> mydata(new A());

如何将其转换为g_timeout_add(.., void*)的arg?

根据您的标题,我假设gpointer实际上是void*。在这种情况下,我还假设当你说might delete arg when it finish时,你实际上是指free(),因为一旦你放弃了原始类型,你就不能保证delete是合法的。

在这种情况下,在任何情况下都不应该使用智能指针传递给g_timeout_add调用,因为这可能会导致回调和智能指针都删除同一内存,这是未定义的行为。

您需要决定谁拥有mydata:调用者、回调方或共享方。然后,基于此,您可以实现调用者/回调代码,以正确地表示这些所有权语义。