gpt4 book ai didi

c++ - 智能指针 + "this"被认为是有害的?

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

在使用智能指针的 C++ 项目中,例如 boost::shared_ptr ,关于使用“this”的好的设计理念是什么?

考虑一下:

  • 存储包含在任何智能指针中的原始指针供以后使用是很危险的。您已经放弃了对对象删除的控制,并相信智能指针会在正确的时间执行此操作。
  • 非静态类成员本质上使用 this 指针。这是一个原始指针,无法更改。

  • 如果我曾经存储 this在另一个变量中或将其传递给另一个函数,该函数可能将其存储以备后用或将其绑定(bind)在回调中,我正在创建错误,当有人决定创建指向我的类的共享指针时,这些错误会被引入。

    鉴于此,我什么时候明确使用 this 合适指针? 是否有设计范式可以防止与此相关的错误?

    最佳答案

    错误的问题

    In a C++ project that uses smart pointers



    这个问题实际上与智能指针无关。这只是关于所有权。

    智能指针只是工具

    他们没有改变所有权的概念,尤其是。 需要在您的程序中拥有明确定义的所有权 ,所有权可以自愿转让,但不能由客户取得的事实。

    您必须了解智能指针(还有锁和其他 RAII 对象)表示一个值,并且同时表示一个与该值对应的关系。 A shared_ptr是对对象的引用并建立关系:对象在此之前不得销毁 shared_ptr , 当这个 shared_ptr被销毁,如果它是最后一个别名该对象,则必须立即销毁该对象。 ( unique_ptr 可以被视为 shared_ptr 的一个特例,其中根据定义零别名,所以 unique_ptr 总是最后一个别名对象。)

    为什么应该使用智能指针

    建议使用智能指针,因为它们只用变量和函数声明来表达很多。

    智能指针只能表达明确定义的设计,它们并不能消除定义所有权的需要。相比之下,垃圾回收不需要定义谁负责内存释放。 (但不要取消定义谁负责其他资源清理的需要。)

    即使在非纯函数式垃圾收集语言中,您也需要明确所有权:如果其他组件仍然需要旧值,您不想覆盖对象的值。在 Java 中尤其如此,其中可变数据结构的所有权概念在线程程序中极为重要。

    原始指针呢?

    使用原始指针并不意味着没有所有权。它只是没有通过变量声明来描述。它可以在注释、设计文档等中进行描述。

    这就是为什么许多 C++ 程序员认为使用原始指针而不是足够的智能指针是 劣质 :因为它的表现力较差(我故意避免使用“好”和“坏”这两个词)。我相信 Linux 内核会更易读一些 C++ 对象来表达关系。

    您可以使用或不使用智能指针来实现特定设计。适当使用智能指针的实现将被许多 C++ 程序员认为是优越的。

    你真正的问题

    In a C++ project, what is a good design philosophy regarding use of "this"?



    这太含糊了。

    It's dangerous to store the raw pointer for later use.



    为什么你需要一个指针供以后使用?

    You've given up control of object deletion and trust the responsible component to do it at the right time.



    实际上,某些组件负责变量的生命周期。你不能承担责任:它必须转移。

    If I ever store this in another variable or pass it to another function which could potentially store it for later or bind it in a callback, I'm creating bugs that are introduced when anyone decides to use my class.



    显然,由于没有通知调用者该函数将隐藏一个指针并稍后在不受调用者控制的情况下使用它,因此您正在创建错误。

    解决方案显然是:
  • 将处理对象生命周期的责任转移给函数
  • 确保指针仅在调用者的控制下保存和使用

  • 只有在第一种情况下,您可能最终会在类实现中使用智能指针。

    你的问题的根源

    我认为您的问题是您正在努力使用智能指针使问题复杂化。智能指针是使事情变得更容易,而不是更难的工具。如果智能指针使您的规范复杂化,那么就更简单的事情重新考虑您的规范。

    在出现问题之前,不要尝试引入智能指针作为解决方案。

    仅引入智能指针来解决特定的明确定义的问题。因为你没有描述一个具体的明确定义的问题, 无法讨论具体的解决方案 (是否涉及智能指针)。

    关于c++ - 智能指针 + "this"被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/382166/

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