【发布时间】:2016-03-11 07:45:09
【问题描述】:
目前我正在使用 glib 库中的一些函数。伴随着 glib 的还有 gio。 glib 是一个 C 库,因此我需要删除我创建的一些结构。
我为许多对象创建了一个智能指针,例如:
std::shared_ptr<GAsyncQueue> my_queue = std::shared_ptr<GAsyncQueue>(g_async_queue_create(), g_async_queue_unref);
为此,它创建了一个指向GAsyncQueue 的共享指针,这样可以安全地销毁队列在其生命结束时。
但是,当我从 gio 库中获得一个我不应该释放的指针时,我遇到了一个问题。在下面的代码中,my_connection 是一个 GSocketClient,它实现了(在 glib 中)GIOStream。
std::shared_ptr<GInputStream> my_input_stream =
std::shared_ptr<GInputStream> (
g_io_stream_get_input_stream(G_IO_STREAM(my_connection.get()))
);
因为 GIOStream 上的文档提到,不应释放使用 g_io_stream_get_input_stream() 获得的指针。那是因为它归my_connection 实例所有。
我想过为销毁对象创建一个lamda,它是共享指针对象的第二个参数。例如auto deleter = [](GInputStream* ptr) {};,然后将该 lambda 作为销毁函数提供给共享指针,但这感觉有点愚蠢。
【问题讨论】:
-
为什么要使用(智能)指针?引用还不够吗?
-
@black 我还在考虑它。输入流是被复制的对象的一个实例。 GIOStream 在调用最后一个复制析构函数时被销毁。也许因为无论如何我都不需要销毁它,所以一个普通的旧指针也可以...
-
还有一个指针我可以设置为NULL,这样就比较容易看是否初始化了。
标签: c++ pointers c++11 shared-ptr