关于 c :Explicit delete and new vs using a unique_ptr | 珊瑚贝

Explicit delete and new vs using a unique_ptr


我有一个回调传递给异步函数,该函数只负责删除传递给异步函数的指针。
我应该如何删除指针:

  • 通过使用显式删除。
  • 通过创建一个将删除对象的 unique_ptr。
  • 对于对象的创建也有同样的问题 – 我应该使用 new 还是创建一个 unique_ptr 并立即释放它。

    1
    2
    MyClass* myClass = make_unique<MyClass>().release();
    AsyncFunc(myClass, [myClass](){std::unique_ptr<MyClass>(myClass)}

    vs

    1
    2
    MyClass* myClass = new MyClass();
    AsyncFunc(myClass, [myClass](){delete myClass;)}
    • AsyncFunc 的声明是什么?
    • 如果 AsyncFunc 取得 myClass 的内存所有权,那么理想情况下它应该接受一个 std::unique_ptr<MyClass> 以在语义上表明它这样做。在这种情况下,您不需要传递回调来删除指针,只要 AsyncFunc 完成使用它,它就会被删除。但是,如果没有更多信息,就很难确定您要达到的目标。
    • 我认为不需要显式删除。我想知道你想归档什么。在将指针传递给异步删除之前,如何创建和使用该指针非常重要。 std::auto_ptr 会做得很好。我认为你是从错误的angular解决它。从头开始。
    • MyClass* myClass = make_unique<MyClass>().release(); 行完全没有意义。


    都没有。

    你应该这样做……

    1
    2
    3
    4
    5
    auto myClass = make_unique<MyClass>();
    // hand out pointers to myClass by using myClass.get() as needed
    AsyncFunc([p = std::move(myClass)]{ p.reset(); });
    // make sure any pointers to myClass you handed out are unused/gone
    // by the time the async func is called

    这样你永远不会通过原始指针持有所有权(你不应该这样做),并且 lambda 拥有 myClass 的所有权,因为它已被 moved 到 lambda 捕获中。

    您也可以省略 p.reset() 并在 lambda 死亡时让指针死亡,我假设(取决于 AsyncFunc)是在调用 lambda 之后立即发生的。

    • 听起来他不想传递一个异步运行的函数,听起来 AsyncFunc 异步做了一些未指定的工作,他想要一个函数在之后调用以清理内存,在这种情况下,他只需要一个 std::unique_ptr .很难说他想做什么。
    • @David 哦,我明白了,是的,我同意所有观点——这取决于他想要做什么。目前还不清楚。
    • c 11 支持这种语法吗?看起来它仅在 c 14 中受支持,我需要使用 c 11。
    • @user844541 好吧,如果您不能使用 c 14,我想我会做同样的事情,但使用 shared_ptr,其中 lambda 在复制后是 shared_ptr 的唯一所有者


    来源:https://www.codenong.com/30330297/

    微信公众号
    手机浏览(小程序)

    Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

    Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

    Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9732.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
    0
    分享到:
    没有账号? 忘记密码?