gpt4 book ai didi

c++ - 有没有一种意识形态的方法来避免使用 Naked New?

转载 作者:行者123 更新时间:2023-12-01 14:20:18 24 4
gpt4 key购买 nike

在我的应用程序中,我需要设置回调,其唯一职责是更新与单独对象中已完成事件关联的状态,以便以后可以查询。但是,由于 API 的设计方式,我不能保证在事件完成时另一个对象仍将拥有,所以我需要存储一个指向该对象的指针,并且因为回调 API 是基于 C 的,我最终存储了一个指向智能指针的原始指针,这是我见过的最丑陋的一段代码*。

* 无论如何,在过去的几个小时里...

所以这就是我为实现这一目标而写的:

event.setCallback(CL_COMPLETE, [](cl_event event, cl_int, void* ptr) {
auto ptr_ptr = static_cast<std::weak_ptr<render_future::shared_state>*>(ptr);
if(auto shared_ptr = ptr_ptr->lock()) {
auto & shared_state = *shared_ptr;
std::lock_guard lock{ shared_state.mutex };
shared_state.event_state[event] = true;
}
delete ptr_ptr;
}, new std::weak_ptr<render_future::shared_state>(future.state));

我特别反对我自己使用 new std::weak_ptr<render_future::shared_state>(future.state) ,对我来说这似乎是某种反模式:使用裸 newdelete结合智能指针。

然而问题在于,因为回调必须是一个函数指针,所以我的 lambda 表达式不能复制或引用其他对象,这是获取 shared_state 的唯一方法。 lambda 内部的对象是将其指针传入;再一次,因为我不能保证它的生命周期没有过期,我需要以指向 weak_ptr 的指针的形式来获取它。以便在(且仅当)对象仍然存在时可以对其进行操作。

所以最终,我的问题是:是否有一种意识形态的方式来传递 shared_state进入这个回调在哪里
  • 我可以检查以确保对象仍然存在,而
  • 也消除了我对裸体的使用 newdelete电话?
  • 最佳答案

    在 lambda 中,通过简单地使用 unique_ptr 可以有明显的改进:

    auto callback = [](cl_event event, cl_int, void* ptr) {
    std::unique_ptr<std::weak_ptr<render_future::shared_state>> ptr_ptr{ static_cast<std::weak_ptr<render_future::shared_state>*>(ptr)};
    if(auto shared_ptr = ptr_ptr->lock()) {
    std::lock_guard lock{ shared_state->mutex };
    shared_state->event_state[event] = true;
    }
    }

    在事物的创造方面,您可以说使用 std::unique_ptr<>::release() .
    auto ptr = std::make_unique<std::weak_ptr<render_future::shared_state>>(future.state);

    event.setCallback(CL_COMPLETE, callback, ptr.release());

    但是,由于您正在使用无捕获的 lambda 调用 C 函数,因此这里不会有意外的异常需要保护,因此无论是否对您当前所做的工作进行了真正的改进,都值得商榷。

    关于c++ - 有没有一种意识形态的方法来避免使用 Naked New?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61648829/

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