gpt4 book ai didi

c++ - 如何将 shared_ptr 与指向不应释放的结构的指针一起使用

转载 作者:IT老高 更新时间:2023-10-28 22:19:28 27 4
gpt4 key购买 nike

目前我正在使用 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 作为破坏函数提供给共享指针,但这感觉有点愚蠢。

最佳答案

好吧,无操作删除器的替代方法可能是使用别名共享指针

template <class U> shared_ptr (const shared_ptr<U>& x, element_type* p) noexcept;

它共享x,但是在get()之后你会得到p

讨论:What is shared_ptr's aliasing constructor for?

关于c++ - 如何将 shared_ptr 与指向不应释放的结构的指针一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34121157/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com