1

有一些函数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());

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

4

1 回答 1

4

我会从你的标题中假设gpointer实际上是void*. 在那种情况下,我也会假设当你说might delete arg when it finish你的意思是free()因为一旦你丢弃了原始类型,你就不能保证 adelete是合法的。

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

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

于 2013-07-30T17:46:39.423 回答