有些函数使用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?
答案 0 :(得分:4)
我将从您的标题中假设gpointer
实际上是void*
。在这种情况下,我还会假设当你说might delete arg when it finish
时你的意思是free()
,因为一旦你抛弃了原始类型,就不能保证delete
合法
在这种情况下,在任何情况下都不应该使用智能指针传递给g_timeout_add
调用,因为它可能会导致回调和智能指针都删除相同的内存,这是未定义的行为
您需要决定谁拥有mydata
:来电者,回叫者或共享者。然后基于此,您可以实现调用者/回调代码以正确表示这些所有权语义。